无法匹配期望的类型`Int'实际类型[Int]平方和

时间:2017-11-22 19:28:02

标签: haskell

fsomaq = x

x = sum (takeWhile (<x) [m | m <- [n*n | n <- [1..]]])

我在这里尝试做的是获得一个限制x,然后对每个数字求平方,然后将所有这些加起来。

有什么想法吗?错误讯息:

 Couldn't match expected type ‘Integer -> t’ with actual type ‘Integer’ •

 The function ‘fsomaq’ is applied to one argument, but its type ‘Integer’ has none In the expression: fsomaq 10 In an equation for ‘it’: it = fsomaq 10 • Relevant bindings include it :: t (bound at :16:1)

2 个答案:

答案 0 :(得分:2)

如果我理解正确,你想要定义一个函数,该函数将数字作为输入,并返回从1到(并包括)该数字的平方和。您可以使用以下命令编写此类函数:

fsomaq :: (Num a, Enum a) => a -> a
fsomaq x = sum [n*n | n <- [1..x] ]

所以我们在这里定义一个函数fsomaq,它将参数x作为输入,然后结果是sum [ n*n | n <- [1..x] ],所以我们写一个列表理解来生成n范围从1到(包括x)的正方形列表,我们发出正方形(n*n)。然后我们计算该列表的总和。

通过将签名定义为(Num a, Enum a) => a -> a,我们可以使用可枚举的任何类型的数字。

例如:

Prelude> fsomaq 0
0
Prelude> fsomaq 1
1
Prelude> fsomaq 2
5
Prelude> fsomaq 4
30
Prelude> fsomaq 8
204
Prelude> fsomaq 1425
965562425

答案 1 :(得分:0)

你在一行中做得太多了。我建议你把它分开以更清楚地推断出解决方案。例如,从:

开始
list = [1..]
squares = [n*n | n <- list]

现在你想对广场列表做什么?你想要一个比给定值小的?然后做一些事情:

squaresLessThanX x = takeWhile (<x) squares

现在我们要总结这些方块:

sumSquaresLessThanX x = sum $ squaresLessThanX x

请注意,这比您正在尝试的oneliner更容易阅读。我们还避免了许多错误,包括不匹配的括号和错误地重用变量名。