我不喜欢在haskell中从右到左阅读函数的顺序。为了解决这个问题,我添加了一个有用的运算符。
module Main where
(>>>) :: a -> (a -> b) -> b
(>>>) a fun = fun a
main = print $ [1..10] >>> map (*2) >>> filter (>5) >>> foldr1 (+)
-- => 104
我想我可以在这里找到一个类似的内置运算符。像绑定运算符 (>>=)。但是绑定运算符的工作方式不同,或者确切地说我不明白它是如何工作的。它似乎使用 concat 映射。但为什么?
我要改进该操作员的下一点是让他调用一次。例如:
print $ [1..10] >>> map (*2) $ filter (>5) $ foldr (+)
我尝试使用(>>>) a = a
and来实现(>>>) a fun = (>>>) (fun a)
,但似乎这种重载是不可能的。澄清一下,我专注于函数的学习,但对 monads、types 和 classes 仍然一无所知。
所以我的问题是:内置运算符或正确使用绑定运算符。