是否有“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)))
composed xs = filter ((== maxLength) . length) modified
,其中modified = fmap (++ "!!!") xs
,maxLength = maximum $ fmap length modified
(适当添加空格)。 - user253751