在列表中检查数字:"无法匹配预期类型' Bool'"

时间:2017-09-30 15:40:02

标签: haskell

所以,我刚刚开始使用Haskell,我试图制作一个列表,例如,从[1..99]创建一个列表,并检查可以被他们的总和整除的数字数字,例如63(6 + 3 = 9,63除以9)。

我正在做以下事情:

digits = map digitToInt . show
inac = [x | x <- [1..99], digits x] -- (testing here)

它给了我以下错误:

<interactive>:83:38: error:
    • Couldn't match expected type ‘Bool’ with actual type ‘[Int]’
    • In the expression: digits x
      In a stmt of a list comprehension: digits x
      In the expression: [x | x <- [1 .. 999], digits x]

提前致谢,对不起,如果这只是一个菜鸟错误。

2 个答案:

答案 0 :(得分:2)

这是列表理解的一般形式:

[ expr | pattern1 <- expr1, pattern2 <- expr2 ..., test1 ,test2 ... ]

也就是说test1test2等都是Bools。这些是布尔值,经过测试可以查看列表中的内容。

你的表情有问题:

[x | x <- [1..99], digits x]
--                 ^^^^^^^^ Here

问题是,digits x不是Bool,而是[Int]。正确的表达方式是:

[ x | x <- [1..99], x `rem` sum (digits x) == 0]

在英语中,我们将其读作&#34;所有数字x从1到99,其中x的数字除以x。&#34;

您的问题是,您试图说数字列表是Bool,GHC并不理解。

答案 1 :(得分:0)

你没有检查列表理解的后卫部分。你可以这样做;

digits :: Integral a => a -> [a]
digits 0 = []
digits n = digits (n `div` 10) ++ [n `rem` 10]

inac :: Integral a => [a]
inac = [x | x <- [1..99], x `rem` sum (digits x) == 0]]

*Main> inac
[1,2,3,4,5,6,7,8,9,10,12,18,20,21,24,27,30,36,40,42,45,48,50,54,60,63,70,72,80,81,84,90]