我知道我可以制作一个函数来实现这一点,但我可以使用前奏中的filter函数吗。我可以很容易地过滤所有大于3的数字,例如使用从列表中过滤
filter (>3) [list]
但我想要像一样的东西
filter (not (.. `mod` 4 == 0)) [list]
过滤掉所有四的倍数。我把。。因为我不知道那里会发生什么。有没有什么方法可以使用filter函数来实现这一点,或者我应该制作自己的函数来实现它?提前感谢
你几乎做到了:
filter (n -> not (n `mod` 4 == 0)) [list]
n
读作"lambda n",并引入了一个匿名函数。也就是说,给定n
的函数测试它是否不是4
的倍数。
否则,您可以使用"无点"样式,在该样式中您可以组成几个函数:
filter (not . (== 0) . (`mod` 4)) [list]
函数读作:取输入,取其模4
,然后测试结果是否等于0,最后否定该测试的结果。
请注意,您也可以使用/= 0
而不是== 0
和否定。
顺便说一句:最新版本的ghc有一个名为TypeHoles
的扩展,它有时可以帮助处理"我把..放在这里,因为我不知道那里会发生什么"类型的情况。
它在ghci中默认启用。如果在代码中的一个表达式上保留_
,ghc将尝试推断_
中的东西可能具有什么类型。
# :t filter _ [1,2,3,4]::[Int]
<interactive>:1:8:
Found hole `_' with type: Int -> Bool
In the first argument of `filter', namely `_'
In the expression: filter _ [1, 2, 3, ....] :: [Int]
随着类型变得越来越复杂,它变得更有帮助。
使用lambda表达式:
filter (x -> x `mod` 4 /= 0) list
或者,如果你喜欢冒险,可以使用免积分风格:
filter ((/= 0) . (`mod` 4)) list
(我认为list
周围的[]
是一个错误,您可能不希望只列出一个名为list
的元素。)