如何在Haskell中将“可能”列表添加到列表

vwkv1x7d  于 2022-11-14  发布在  其他
关注(0)|答案(2)|浏览(241)

我有一个类似下面提供的函数:

zip :: [a] -> [b] -> Maybe [(a,b)]
zip (headX:tailX) (headY:tailY) = (headX,headY):zip tailX tailY
zip _ _ = Nothing

现在

zip tailX tailY

将返回一个类型为Maybe的列表,并且我尝试使用以下方法将(headX,headY)前置到该列表:运算符。有没有简单的方法可以做到这一点?如果我试图直接将它前置,编译器会给我错误,因为:运算符只对列表有效

ni65a41a

ni65a41a1#

Maybe []不是[]。您不能直接使用:
但是您可以定义一个函数来为您执行此操作,使用模式匹配来获取其中包含的列表(如果存在列表)。

mycons :: a -> Maybe [a] -> Maybe [a]
mycons _ Nothing = Nothing
mycons v (Just lst) = Just (v:lst)

现在:

mycons 1 $ mycons 2 $ mycons 3 $ Just []
-- Just [1,2,3]

mycons 1 $ mycons 2 $ mycons 3 $ Nothing
-- Nothing
c2e8gylq

c2e8gylq2#

一种方法是使用fmap将您的prepending-to-a-list操作转换为prepending-to-every-list-in-a-container-of-lists操作。

zip (headX:tailX) (headY:tailY) = fmap ((headX,headY):) (zip tailX tailY)

有时候使用fmap的中缀版本会更清楚。

zip (headX:tailX) (headY:tailY) = ((headX,headY):) <$> zip tailX tailY

在这种情况下,我没有强烈的偏好;让你心指引你

相关问题