我目前正在学习使用 monad 进行计算的基础知识。我一直在检查代码片段,我相信我知道它们的作用,但我可能需要澄清一下。它涉及 Maybe monad 的实例。
有一些函数试图计算尾部,还有一个函数试图计算列表的头部。下面的函数在使用列表调用时会产生等效的结果[1,2,3,4,5] = Just 3
该函数func3
似乎“跳过”了一个额外的计算步骤func2
。我是否正确地说,func3
将计算结果输入到下面的尾部计算中,然后计算它的尾部,然后将该计算的结果传递给下面计算头部的函数?
如果是这样,那么为什么我们需要func2
忽略初始计算的结果?在我看来,它好像在运行myTail xs
计算,然后将其值传递给函数,该函数使用初始列表而不是尾部计算的结果。
因此,这只是说明每一个的多余步骤a, b, c
吗?我假设这func3
也相当于func1
,只有最顶层的计算是a
。
非常感谢大家。
--computes head
myHead :: [a] -> Maybe a
myHead [] = Nothing
myHead (x:xs) = Just x
--computes tail
myTail :: [a] -> Maybe [a]
myTail [] = Nothing
myTail (x:xs) = Just xs
--below are all equivalent
func1 :: [a] -> Maybe a
func1 xs =
do a <- myTail xs
b <- myTail a
c <- myHead b
return c
func2 :: [a] -> Maybe a
func2 xs =
myTail xs >>=
(\a -> myTail xs >>=
(\b -> myTail b >>=
(\c -> myHead c)))
func3 :: [a] -> Maybe a
func3 xs =
myTail xs >>=
(\a -> myTail a >>=
(\b -> myHead b))