all_nat x = [ls| sum ls == x]
我想编写一个给定整数x的函数,它返回所有列表,当求和时它们的元素的结果是整数x,但我总是得到错误“不在范围内:'ls'”它的出现次数。我是哈斯凯尔的新手。这里的语法错误是什么?
答案 0 :(得分:1)
让我们把它分成两部分。如果我已正确理解您的问题,第一步是从列表中生成所有可能的(子)列表。有一个功能,称为subsequences
。
第二步是评估每个子序列的总和,并将子序列与所需的总和保持一致。所以你的列表理解是这样的:
all_nat x = [ls| ls <- subsequences [1..x], sum ls == x]
答案 1 :(得分:1)
问题是您需要在某处定义所有使用的变量,但ls
未定义。而且,不能自动定义,因为编译器不知道任务 - 应该如何生成列表?好久不过可以吗?术语是积极与否,不是积分或不积分?不幸的是,对于现代非AI语言,问题的代码定义非常模糊。
让我们帮助编译器。为了解决这些问题,通常需要一些数学并且归纳地推断算法。例如,让我们编写一个带有有序列表的算法(其中[2,1]和[1,2]是不同的解决方案):
allNats 0 = [[]] --One empty list
allNats n = [ k:rest --Add k as a head to the rest, where
| k <- [1 .. n] --k is taken from 1 to n, and
, rest <- allNats (n - k)] --rest is taken from solutions for (n—k)
这就是全部!我们来测试一下:
ghci> allNat 4
[[1,1,1,1],[1,1,2],[1,2,1],[1,3],[2,1,1],[2,2],[3,1],[4]]
答案 2 :(得分:0)
怎么样?
getAllSums x = [(l,r)| l <- partial_nat, r <- partial_nat, l + r == x ]
where partial_nat = [1..x]