我有一個像下面這樣的程式。
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'''with >>=。
uj5u.com熱心網友回復:
您可以將 Applicative 與join.
首先,您可以使用<$>and將該函式應用于引數<*>:
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'call 也可以用相同的術語表示,因為<$>(aka fmap) 和的組合join等價于>>=:
print (join (incVal' <$> Just 42))
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/532468.html
標籤:哈斯克尔
