Haskell,传递一个函数来过滤一行?

时间:2014-04-24 04:18:58

标签: haskell

我想从Haskell的列表中筛选出不能被3整除的所有内容,这在技术上是我想做的事情

filter (`mod` 3) [1..100]

问题是,mod x 3不会返回布尔值。有没有办法在一行中做到这一点?还是我被迫写另一个返回布尔值的函数?我已经阅读了关于curried函数的内容,但是我不确定它是否可以这样做,因为如果我使用(==)a b和a是一个函数,它就不会有效。

5 个答案:

答案 0 :(得分:9)

这就是函数组合的用途:

filter ((== 0) . (`mod` 3)) [1..100]

与以往一样,考虑所涉及的功能的类型,直到一切都感觉自然。

答案 1 :(得分:7)

你可以使用点符号

filter ((== 0) . (`mod` 3)) [1..100]

这会生成

[3,6,9,12,15,18,21,24,27,30,33,36,39,42,45,48,51,54,57,60,63,66,69,72,75,78,81,84,87,90,93,96,99]

dot的类型签名如下:

(.) :: (b -> c) -> (a -> b) -> a -> c

答案 2 :(得分:6)

如果你想在一行中定义它并且不想编写另一个函数(无论如何只会在一个地方使用),最简单的方法是定义lambda function

filter (\x -> x `mod` 3 == 0) [1..100]
当辅助功能比这更复杂时,其他答案中建议的

Point-free样式有时会导致“难以阅读”的表达式。特别是初学者。

答案 3 :(得分:4)

您还可以使用列表理解:

[x | x <- [1..100], (x `mod` 3) == 0]

答案 4 :(得分:2)

替代版本,使用流:

takeWhile (<=100) $ map (*3) [1..]