如果列表包含一些可被42整除的值,请使用“ any”告诉您是非题

时间:2018-11-13 03:35:47

标签: haskell

在完成Haskell教程时很开心...

所出现的一个问题是您在主题行中看到的...这是我很想找出的问题,但是我很茫然...我像这样使用any

ghci >any (==55) [15,25,35,45,55,65,75,85,95]
True
ghci >any (==55) [15,25,35,45,54,65,75,85,95]
False
ghci >all even [2,4,6,8]
True
ghci >all even [1,3,5,7,9]
False

似乎很容易检查列表元素是否可被42整除...

我的意思是,您将检查列表中的任何数字是否为n `mod` 42 == 0,对吗?

但是您如何在表达式中说明呢?还是需要编写一个“助手”功能?

2 个答案:

答案 0 :(得分:8)

您可以就地定义函数:

any (\n -> n `mod` 42 == 0) [1, 2, 42]

答案 1 :(得分:6)

组成^[a-zA-Z-\s]*$ ^[a-zA-Z\s]+-*[a-zA-Z\s]*$

(0==)

进一步降低括号噪声:

(`mod 42`)

辅助功能:

f :: [Integer] -> Bool
f = any ((0==).(`mod` 42))

通常,对于此功能,任何一种方法似乎都不错。但是,假设您想检查是否有任何值可以用42 OR 52整除,那么利用合成可能会变得更加模糊/复杂/徒劳。而使用辅助函数使内容可读:f :: [Integer] -> Bool f = any $ (0==).(`mod` 42) 。请注意,我在上面使用了f :: [Integer] -> Bool f = any div42 where div42 n = n `mod` 42 == 0 子句,但是div42Or52 n = n `mod` 42 == 0 || n `mod` 52 == 0表达式或lambda是构造辅助函数的可能替代方法。

最终,由开发人员决定在简洁的代码与可理解的代码之间取得平衡。