如何在Haskell中使用filter从列表中筛选出某个数字的所有倍数



我知道我可以制作一个函数来实现这一点,但我可以使用前奏中的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的元素。)

最新更新