【发布时间】:2021-11-10 09:36:48
【问题描述】:
在学习 Haskell 时,我遇到了这个 flipMaybe 函数:
flipMaybe :: [Maybe a] -> Maybe [a]
flipMaybe [] = Just []
flipMaybe (Nothing:xs) = Nothing
flipMaybe (Just x:xs) = case flipMaybe xs of
Nothing -> Nothing
Just ls -> Just (x:ls)
我无法理解最后一行。 ls 这里是什么?递归在这里如何工作?或者换句话说,有人可以告诉我这个函数是如何解决flipMaybe [Just 1, Just 2, Just 3] 的吗? (一步一步)
【问题讨论】:
-
ls是包裹在递归的Just中的数据,所以如果flipMaybe [Just 2, Just 3]是Just(这里是Just [2, 3],那么ls是一个列表[2, 3]因此,它以x开头,并包裹在Just中。 -
flipMaybe [Just 1, Just 2, Just 3]-->case flipMaybe [Just 2, Just 3] of ...-->case Just [2, 3] of Nothing -> Nothing; Just ls -> Just (1: ls)-->Just (1:[2, 3]) -
也就是说
case ... of ...中的Just ls是模式匹配,类似于filpMaybe定义中的Just x:xs模式匹配。但是这一次,我们不是对函数的输入进行模式匹配,而是对递归调用flipMaybe xs的输出进行模式匹配 -
您在这里实现的是
sequence与m ~ Maybe和t ~ []的特例。