MYV*_*MYV 13 haskell pointfree function-composition
我想知道是否可以使用带有多个参数的函数进行功能组合.我希望能够做这样的事情
x = (+3).(*)
Run Code Online (Sandbox Code Playgroud)
设置x等于将两个数字的乘积加三的函数.
lef*_*out 23
有多种方法可以做到,但它们都有点尴尬.
((+3).) . (*)
? fmap (+3) . (*)
? curry $ (+3) . uncurry (*)
? \l r -> l*r + 3
Run Code Online (Sandbox Code Playgroud)
哦,等等,这是签名,其中也有一个紧凑的定义,猜猜它叫什么...
((.).(.)) (+3) (*)
Run Code Online (Sandbox Code Playgroud)
我认为lambda解决方案是最明确的,在这里是最好的.
有助于并且通常在本地作为一个(或两个)-liner进行的操作是将此组合定义为自定义中缀:
(.:) :: (c->d) -> (a->b->c) -> a->b->d
f .: i = \l r -> f $ i l r
Run Code Online (Sandbox Code Playgroud)
这让你简单地写(+3) .: (*).
顺便说一句,对于类似的(b->b->c) -> (a->b) -> a->a->c(对中缀的两个参数预先组合正确的函数),存在广泛使用的标准实现.