我想从Haskell的列表中筛选出不能被3整除的所有内容,这在技术上是我想做的事情
filter (`mod` 3) [1..100]
问题是,mod x 3不会返回布尔值。有没有办法在一行中做到这一点?还是我被迫写另一个返回布尔值的函数?我已经阅读了关于curried函数的内容,但是我不确定它是否可以这样做,因为如果我使用(==)a b和a是一个函数,它就不会有效。
答案 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..]