部分应用mplus以无点样式重写功能

Bru*_*rry 1 haskell applicative

我正在阅读一些Haskell教程,并尝试熟悉该语言.我在Monad/MonadPlus教程中看过这个例子:

data Sheep = Sheep {name :: String, mother :: Maybe Sheep, father :: Maybe Sheep}
parent :: Sheep -> Maybe Sheep
parent s = mother s `mplus` father s
Run Code Online (Sandbox Code Playgroud)

我试图用无点样式重写它(就像一个练习,不是说上面是错误的或非惯用的),但我卡住了:显然我可以写一个自定义函数

partialPlus :: (MonadPlus m) => (a -> m b) -> (a -> m b) -> a -> m b
partialPlus f1 f2 = \x -> f1 x `mplus` f2 x
Run Code Online (Sandbox Code Playgroud)

然后使用

parent = partialPlus mother father
Run Code Online (Sandbox Code Playgroud)

但我似乎从LYAH教程中记得,有一种方法可以使用仿函数或应用仿函数来构造计算树,最终可以提供参数以从"仿函数盒"中获取结果.但是我似乎无法在教程中找到该示例.我如何"巧妙地"重写上述内容?

ham*_*mar 5

使用Applicative实例进行功能:

parent :: Sheep -> Maybe Sheep
parent = mplus <$> mother <*> father
Run Code Online (Sandbox Code Playgroud)

  • @BruceBerry:你可以使用`> =>`(又名.Kleisli组合)运算符,就像`flip(.)`和monad一样,所以`grandparent = parent> => parent`. (2认同)