如何惯用地将 1 加到两个 Maybe Int,然后在 haskell 中将它们相乘

Ada*_*dam 4 haskell

昨天我读了一些关于整个 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)