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

snz8szmq  于 2022-12-19  发布在  其他
关注(0)|答案(2)|浏览(122)

昨天我读了一些关于monad的东西。我一点也不理解它,但这不会阻止我尝试使用它。in this question的一些答案确实推动了monad的存在,使事情变得更好,更具可读性。“Haskell对monad有很好的支持”,这是否意味着我可以写很好的代码,例如,可能是开箱即用?
或者这是否意味着我可以为maybe类型编写代码,使其易于使用。
我遇到了以下问题时,做降临的代码:
将两个Maybe中的值加1,然后将它们相乘。
在阅读question on multiplying two maybes并检查了typeclassopedia之后,我到达了(在一些严重的挠头之后):

let test = Just (*) <*> ((+1) <$> marker1Pos) <*> ((+1) <$> marker2Pos)

它起作用了,但对我来说,这看起来不太理想。
我可以用我在第一个链接中读到的do块来做吗?

ego6inou

ego6inou1#

当然,你可以用do来做。

do  x <- marker1Pos
    y <- marker2Pos
    return ((x + 1) * (y + 1))

对于您编写的版本,我也倾向于使用liftM2liftA2,对于节,我也倾向于使用fmap而不是<$>。您可能会或可能不会觉得这更有吸引力,但我提供它以防万一:

liftA2 (*) (fmap (+1) marker1Pos) (fmap (+1) marker2Pos)
qjp7pelc

qjp7pelc2#

您可以在以下位置使用**on :: (b -> b -> c) -> (a -> b) -> a -> a -> c**:

import Control.Applicative(liftA2)
import Data.Function(on)

f :: (Applicative f, Num a) => f a -> f a -> f a   
f = liftA2 (*) `on` fmap (1+)

相关问题