在完成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
,对吗?
但是您如何在表达式中说明呢?还是需要编写一个“助手”功能?
答案 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是构造辅助函数的可能替代方法。
最终,由开发人员决定在简洁的代码与可理解的代码之间取得平衡。