如何在高阶函数haskell中使用Maybe?

Joh*_*ana 2 haskell higher-order-functions

我想解决以下问题,其中 f 不返回任何内容,然后删除第一个元素。如果 f 返回 Just x,则第一个元素随 x 改变。我下面的答案对 Nothing 正确,但我无法理解如何在函数内部区分 Nothing 和 Just

change:: (a -> Maybe a) -> [a] -> [a]
change f [] = []
change f (x:xs) = xs
Run Code Online (Sandbox Code Playgroud)

改变(\x -> 没有) [1..5] == [2..5]

change(\x -> Just 10) [1,2,3] == [10,2,3]

Car*_*ten 7

对于一个简单的解决方案,您可以像这样进行模式匹配(与case)f x:

change:: (a -> Maybe a) -> [a] -> [a]
change _ [] = []
change f (x:xs) =
   case f x of
       Just x' -> x':xs
       Nothing -> xs
Run Code Online (Sandbox Code Playgroud)

那应该做你所描述的


对于较短的,您可以使用maybeToList并连接这样的部分:

change:: (a -> Maybe a) -> [a] -> [a]
change _ [] = []
change f (x:xs) = (maybeToList $ f x) ++ xs
Run Code Online (Sandbox Code Playgroud)