所以,我刚刚开始使用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]
提前致谢,对不起,如果这只是一个菜鸟错误。
答案 0 :(得分:2)
这是列表理解的一般形式:
[ expr | pattern1 <- expr1, pattern2 <- expr2 ..., test1 ,test2 ... ]
也就是说test1
,test2
等都是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]