我有一个类似贝娄的程序。
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'''
。
1条答案
按热度按时间7jmck4yq1#
您可以将“应用”与
join
结合使用。首先,您可以使用
<$>
和<*>
将函数套用至参数:但这还不够,因为根据
<*>
的工作方式,结果将是Maybe (Maybe Int)
,因此上面的行将打印"Just (Just 42)"
。因此,最后一步,要“取消嵌套”该值,可以使用
join
函数,这是一个标准的Monad操作:当然,同样的方法也适用于
incVal'''
:顺便说一句,甚至
incVal'
调用也可以用相同的术语来表示,因为<$>
(也称为fmap
)和join
的组合等价于>>=
: