gpt4 book ai didi

haskell - 映射然后在 Haskell 中过滤

转载 作者:行者123 更新时间:2023-12-04 17:11:04 27 4
gpt4 key购买 nike

我想在 Haskell 中映射一个整数类型列表,然后如果 map 函数返回 Nothing 我想丢弃结果。我正在尝试编写的函数的类型签名为

mapThenFilter :: (Integer -> Maybe Integer) -> [Integer] -> [Integer]
到目前为止,我想过这样做:
checkIfNothing value = case value of 
Just a -> a
Nothing -> 0

mapThenFilter = map checkIfNothing(map f l)
但这是不正确的。我是 Haskell 的新手,所以如果可能的话,你能告诉我我哪里出错了吗?我相信因为这是 Map 然后是 Filter,所以也可能会使用 Haskell 过滤器函数,但是,我相信我的函数定义中的外部 map 函数正在完成(过滤器函数的)预期工作,对吗?

最佳答案

如评论中所述,您正在重新实现 mapMaybe .
哪个好。这是一个不明显的功能,很高兴你感觉到需要它并想出这个想法,用它的类型来表达。
如果你想按照自己的方式来做,实际上你已经有了一个良好的开端。不过需要调整一下:

checkIfNothing value = case value of 
Just a -> a
Nothing -> 0
0太具体了,我们一起去 [] .但现在只需返回 a不会工作。让我们也把它放在一个列表中:
checkIfNothing :: Maybe t -> [t]
checkIfNothing value = case value of
Just a -> [a]
Nothing -> []
所以现在,
mapThenFilter f l  =   map checkIfNothing (map f l)
几乎是正确的。我们在列表中生成我们的结果,而那些被跳过的结果是空列表:
   -- instead of
[ a, b, c, .... , z ]
-- we produce
[ [], [b], [], .... , [z] ]
所以我们只需要连接它们,用 ++ 将它们连接在一起s:
     []++[b]++[]++...,++[z]  

[ b, ...., z ]
所以我们定义
mapThenFilter :: (a1 -> Maybe a) -> [a1] -> [a]
mapThenFilter f l = concat $ map checkIfNothing (map f l)
顺便说一句 checkIfNothing也已经存在。它被称为 maybeToList :
> foo f l = concat $ map maybeToList $ map f l
foo :: (a1 -> Maybe a) -> [a1] -> [a]

> foo (\x -> listToMaybe [x | even x]) [1..10]
[2,4,6,8,10]
concat的组合和 map重要到足以分配一个特殊的功能来完成它的工作, concatMap .这个函数非常重要,甚至可以分配一个特殊的运算符来完成它的工作:
foo f = concat . map maybeToList . map f  
= concat . map (maybeToList . f)
= concatMap (maybeToList . f)
= (maybeToList . f =<<)

关于haskell - 映射然后在 Haskell 中过滤,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69439965/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com