昨天我读了一些关于整个 monad 的内容。我绝不掌握它,但它不会阻止我尝试使用它。这个问题中的一些答案确实推动了 monad 的存在,让事情变得更好、更具可读性。“Haskell 对 monad 有很好的支持”,这是否意味着我可以编写很好的代码,例如开箱即用?
或者这是否意味着我可以为可能的类型编写代码,从而使其易于使用。
我在做代码出现的时候遇到了如下问题:
将两个 Maybe 中的值加 1,然后将它们相乘。
在阅读了有关乘以两个可能的问题并查看了类型分类百科之后,我得出了以下结论(经过一番认真的挠头之后):
let test = Just (*) <*> ((+1) <$> marker1Pos) <*> ((+1) <$> marker2Pos)
Run Code Online (Sandbox Code Playgroud)
它有效,但对我来说看起来不太理想。
我可以使用我在第一个链接中读到的 do-block 来完成此操作吗?
Lou*_*man 10
当然,您可以使用do.
do x <- marker1Pos
y <- marker2Pos
return ((x + 1) * (y + 1))
Run Code Online (Sandbox Code Playgroud)
我也倾向于使用liftM2orliftA2来表示您编写的版本,并且我也倾向于使用fmap来代替<$>for 部分。您可能会或可能不会觉得这更有吸引力,但我提供它以防万一您这样做:
liftA2 (*) (fmap (+1) marker1Pos) (fmap (+1) marker2Pos)
Run Code Online (Sandbox Code Playgroud)