Haskell不在范围列表理解中

时间:2014-03-18 11:50:57

标签: haskell list-comprehension

 all_nat x = [ls| sum ls == x]

我想编写一个给定整数x的函数,它返回所有列表,当求和时它们的元素的结果是整数x,但我总是得到错误“不在范围内:'ls'”它的出现次数。我是哈斯凯尔的新手。这里的语法错误是什么?

3 个答案:

答案 0 :(得分:1)

让我们把它分成两部分。如果我已正确理解您的问题,第一步是从列表中生成所有可能的(子)列表。有一个功能,称为subsequences

第二步是评估每个子序列的总和,并将子序列与所需的总和保持一致。所以你的列表理解是这样的:

all_nat x = [ls| ls <- subsequences [1..x], sum ls == x]

答案 1 :(得分:1)

问题是您需要在某处定义所有使用的变量,但ls未定义。而且,不能自动定义,因为编译器不知道任务 - 应该如何生成列表?好久不过可以吗?术语是积极与否,不是积分或不积分?不幸的是,对于现代非AI语言,问题的代码定义非常模糊。 让我们帮助编译器。为了解决这些问题,通常需要一些数学并且归纳地推断算法。例如,让我们编写一个带有有序列表的算法(其中[2,1]和[1,2]是不同的解决方案):

  1. 从基础开始,您知道某些给定输入的输出。例如,对于0,只有一个空的术语列表(如果0可以是一个术语,任何数字都可以以无限多种方式分解为总和)。所以,让我们来定义:
  2. allNats 0 = [[]] --One empty list
    1. 归纳步骤。假设我们可以分解一个数字 n ,我们可以通过添加 k来分解任何数 n + k 以获得任何正 k em>作为 n 的所有分解的术语。换句话说:对于大于0的数字,我们可以将任意数 k 从1到 n ,并使其成为( n)的所有分解的第一项 - ķ):
    2. 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]