具有谓词的Haskell映射函数

Pau*_*aul 7 haskell functional-programming map filter

我觉得这应该是相当明显或容易的,但我无法得到它.我想要做的是将一个函数应用于列表(使用map),但仅在条件被保持时.想象一下,你只想划分偶数的数字:

map (`div` 2) (even) [1,2,3,4]
Run Code Online (Sandbox Code Playgroud)

这将给出[1,1,3,2],因为只有偶数才会将函数应用于它们.显然这不起作用,但有没有办法让这项工作无需编写你可以给地图分离的单独功能?过滤器几乎就在那里,除了我还想保留条件不适用的元素,而不是将函数应用于它们.

谢谢

Cat*_*lus 10

如果您不想定义单独的函数,那么使用lambda.

map (\x -> if (even x) then (x `div` 2) else x) [1,2,3,4]
Run Code Online (Sandbox Code Playgroud)

或者代替地图,列表理解,我认为更具可读性.

[if (even x) then (x `div` 2) else x | x <- [1,2,3,4]]
Run Code Online (Sandbox Code Playgroud)

  • @FUZxxl:运行`ghc -ddump-simpl`,你会看到没有创建中间列表.默认[重写规则](http://www.haskell.org/ghc/docs/latest/html/users_guide/rewrite-rules.html)和其他优化过程比这更聪明. (2认同)

Tom*_*ett 7

mapIf p f = map (\x -> if p x then f x else x)
Run Code Online (Sandbox Code Playgroud)

  • 请注意,如果您在上面将`map`更改为`fmap`,这可以成为`Functor`的更通用的实用程序,而不仅仅是列表. (2认同)