【发布时间】:2021-10-04 17:15:39
【问题描述】:
我想在 Haskell 中映射一个 Integer 类型列表,然后如果 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 then Filter,那么 Haskell 过滤器函数可能也会被使用,但是,我相信我的函数定义中的外部 map 函数正在完成预期的工作(过滤器函数)对吗?
【问题讨论】:
-
map永远不能替代filter,因为filter返回一个删除了一些项目的新列表,而map总是返回一个相同长度的列表 -
您给出的定义本身并没有多大意义,但假设您的意思是
mapThenFilter f l = map checkIfNothing(map f l)以便它编译,那么这并不遥远。它只是用 0 替换f到Nothing的所有元素,而不是删除它们。您应该能够使用它来解决问题,即使它不是您首先提出的最短或最惯用的解决方案。
标签: haskell functional-programming filtering higher-order-functions map-function