【问题标题】:Haskell not in scope list comprehensionHaskell 不在范围列表理解中
【发布时间】:2014-03-18 11:50:57
【问题描述】:
 all_nat x = [ls| sum ls == x]

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

【问题讨论】:

  • 问题是,Haskell 不是 Prolog。它不仅会为您匹配所有可能的值组合。您需要明确使用数字范围(如[1..x])并从中进行选择。
  • 是的,在haskell之前我一直在学习prolog的基础知识。谢谢

标签: haskell list-comprehension


【解决方案1】:

问题是您需要在某处定义所有使用的变量,但 ls 未定义。此外,它不能自动定义,因为编译器不知道任务——应该如何生成列表?可以多长时间?术语是积极的还是消极的,是整体的还是不完整的?不幸的是,对于现代非 AI 语言,您对问题的代码定义非常模糊。 让我们帮助编译器。为了解决这些问题,涉及一些数学并归纳推理算法通常很有用。例如,让我们用有序列表编写一个算法(其中 [2,1] 和 [1,2] 是不同的解决方案):

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

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

    第二步是评估每个子序列的总和,并将子序列保持为您想要的总和。所以你的列表理解看起来像这样:

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

    【讨论】:

      【解决方案3】:

      怎么样

      getAllSums x = [(l,r)| l <- partial_nat, r <- partial_nat, l + r == x ]
        where partial_nat = [1..x]
      

      【讨论】:

      • 您的解决方案只生成对,而不是任意列表。
      猜你喜欢
      • 2015-08-21
      • 2018-06-07
      • 1970-01-01
      • 2022-01-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多