haskell 如何将多个值传递给一元函数

bsxbgnwa  于 2022-11-14  发布在  其他
关注(0)|答案(1)|浏览(188)

我有一个类似贝娄的程序。

incVal :: Num a => a -> a
incVal x = x + 1

incVal' :: (Monad m, Num a) => a -> m a
incVal' x = return (x + 1)

incVal'' :: (Monad m, Num a) => a -> a -> m a
incVal'' x y = return (x + y)

incVal''' :: (Monad m, Num a) => a -> a -> a -> m a
incVal''' x y z = return (x + y + z)

main = do
    print(Just 9 >>= incVal')

我可以用>>=调用incVal'(如上面的代码所示)。但是我不知道如何用>>=调用incVal''incVal'''

7jmck4yq

7jmck4yq1#

您可以将“应用”与join结合使用。
首先,您可以使用<$><*>将函数套用至参数:

print (incVal'' <$> Just 5 <*> Just 37)

但这还不够,因为根据<*>的工作方式,结果将是Maybe (Maybe Int),因此上面的行将打印"Just (Just 42)"
因此,最后一步,要“取消嵌套”该值,可以使用join函数,这是一个标准的Monad操作:

print (join (incVal'' <$> Just 5 <*> Just 37))

当然,同样的方法也适用于incVal'''

print (join (incVal''' <$> Just 1 <*> Just 4 <*> Just 37))

顺便说一句,甚至incVal'调用也可以用相同的术语来表示,因为<$>(也称为fmap)和join的组合等价于>>=

print (join (incVal' <$> Just 42))

相关问题