是否有用于简单函数组合的“do notation”语法糖?
(即(.) :: (b -> c) -> (a -> b) -> a -> c
)
我希望能够存储一些作品的结果以供以后使用(同时仍然继续链条。
如果可能,我宁愿不使用 RebindableSyntax 扩展。
我正在寻找这样的东西:
composed :: [String] -> [String]
composed = do
fmap (++ "!!!")
maxLength <- maximum . fmap length
filter ((== maxLength) . length)
composed ["alice", "bob", "david"]
-- outputs: ["alice!!!", "david!!!"]
我不确定这样的事情是否可行,因为早期函数的结果本质上必须“通过”maxLength 的绑定,但我愿意听到任何其他类似的表达选项。基本上,我需要在完成构图时收集信息,以便以后使用。
也许我可以用状态单子做这样的事情?
谢谢你的帮助!
编辑
这种事情有点工作:
split :: (a -> b) -> (b -> a -> c) -> a -> c
split ab bac a = bac (ab a) a
composed :: [String] -> [String]
composed = do
fmap (++ "!!!")
split
(maximum . fmap length)
(\maxLength -> (filter ((== maxLength) . length)))