我正在阅读一些 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
我试图以无点风格重写它(只是作为一个练习,并不是说上面是错误的或非惯用的),但我卡住了:显然我可以编写一个自定义函数
partialPlus :: (MonadPlus m) => (a -> m b) -> (a -> m b) -> a -> m b
partialPlus f1 f2 = \x -> f1 x `mplus` f2 x
然后使用
parent = partialPlus mother father
但我似乎从 LYAH 教程中记得,有一种方法可以使用函子或应用函子来构造计算树,最终可以输入参数以从“函子盒”中获取结果。但是我似乎无法在教程中找到示例。如何“巧妙”地改写上面的内容?