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)
答案 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更容易阅读。我们还避免了许多错误,包括不匹配的括号和错误地重用变量名。