我正在尝试将列表中任意数量的数学函数组合在一起。
我编写了一个compose函数,它将它们链接在一起:
chain :: (c -> d) -> (a -> b -> c) -> a -> b -> d
g `chain` f = \a b -> g (f a b)
如果要做这样的事情,
let b = (*) `chain` (+) `chain` (-)
创建一个函数,它接受 a b c d 参数,并执行 ((a − b) + c) × d 的操作。
> b 2 3 4 5
> 15
我的问题是,我希望能够根据任意列表将一组这些链接在一起:
[(*),(+),(-)]
将导致 (*) `chain` (+) `chain` (-)
[(*),(+),(-),(*)]
将导致 (*) `chain` (+) `chain` (-) `chain` (*)
这是否可能?我尝试使用折叠,但无法使其工作,因为每次应用元素后累加器的类型都会改变。
例如,三个函数链接在一起的类型为:
b :: Integer -> Integer -> Integer -> Integer -> Integer
但是对于四个而言,它是这样的:
b :: Integer -> Integer -> Integer -> Integer -> Integer -> Integer
如果有人能指点我正确的方向或知道解决方案,那就太好了!谢谢。
编辑:
我的最终目标是能够做到这样:
getZipList $ pure (function composing * and +) <*> ZipList [1,2,3] <*> ZipList [4,5,6]
<*> ZipList [7,8,9]
会导致:
[(1+4)*7, (2+5)*8, (3+6)*9]
(.).(.)
。 - Cubic