首页 > 解决方案 > 如何在高阶函数haskell中使用Maybe?

问题描述

我想解决以下 f 返回 Nothing 的问题,然后删除第一个元素。如果 f 返回 Just x,则第一个元素将更改为 x。我下面的答案适用于 Nothing 但我不明白如何区分 Nothing 和 Just 在函数内部

change:: (a -> Maybe a) -> [a] -> [a]
change f [] = []
change f (x:xs) = xs

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

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

标签: haskellhigher-order-functions

解决方案


对于一个简单的解决方案,您可以像这样进行模式匹配(使用casef x

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

那应该做你描述的


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

change:: (a -> Maybe a) -> [a] -> [a]
change _ [] = []
change f (x:xs) = (maybeToList $ f x) ++ xs

推荐阅读