【问题标题】:Is undefined a partial list in Haskell?未定义是 Haskell 中的部分列表吗?
【发布时间】:2013-06-17 15:29:27
【问题描述】:

undefined 是 Haskell 中的部分列表吗?

我知道[1,2:undefined] 是部分的,但是单独的undefined 呢?

【问题讨论】:

  • 我不知道“部分列表”的正式权威定义,但通常,undefined 在用于列表类型时被视为部分列表。
  • 您能否定义一下部分列表是什么意思?

标签: list haskell


【解决方案1】:

undefined 是一个函数,如果您尝试对其求值,则会导致错误。 (但是,如果你不尝试评估它,它不会有任何害处。)让我们检查 undefined 的类型签名:

ghci> :t undefined
undefined :: a

a 是一个类型变量,并且由于类型签名中没有标识任何约束(类型约束出现在 ::=> 符号之间),a 可以是任何 em> 输入。

我不确定您是否真的想要在您的示例中使用 :

[1,2,undefined]是一个整数列表,所以这个表达式中undefined的类型也是一个整数。

(1:2:undefined) 也是一个整数列表,但: 将一个列表作为它的第二个参数,所以这个表达式中undefined 的类型是一个整数列表。

我认为[1,2:undefined] 没有意义。 1 是整数,但 2:undefined 是整数的列表。您不能拥有包含不同类型元素的列表。


编辑:

undefined 真的不是部分列表*,它只是一个值(可以是任何类型,包括列表)。例如,[1,2,undefined] 是一个包含三个元素的列表。第一个元素是1,第二个元素是2,第三个元素无法计算——但它是一个整数。

*然而,一个以undefined 作为最后一个元素的列表可以用来表示某种“部分列表”,只要你不能评估那个元素。 (我认为这就是@Daniel 的意思)。但是,如果在 之前或之后 有元素,您可以评估它们。例如:

ghci> last [1,2,undefined,4]
4

编辑#2:

另一个例子可能会有所帮助。在这里,我创建了一个包含四个元素的列表,其中一个 (c) 是 undefined。当我查询 ghci 以找出 c 的类型时,我发现它只是一个整数,而不是一个列表。

ghci> let (a:b:c:d) = [1,2,undefined,4]
ghci> :type c
c :: Integer

【讨论】:

  • 是的,但 undefined 是 haskell 中每种类型的值,我要问的是一个未定义的部分列表。
  • 1:2:undefined,考虑到1 :: Integer,未定义的类型不是Integer而是[Integer]
【解决方案2】:

正如 cmets 指出的那样,您的问题不是很清楚,但让我们做一些假设。首先,您可能打算写 1:2:undefined 作为部分列表的示例。

> let p1 = 1:2:undefined
> :t p1
p1 :: [Integer]

所以 p1 有两个元素,其余元素未定义,这在某种意义上使其成为部分列表。按照这个定义,这个类型检查:

> let p2 = undefined :: [Int]
> :t p2
p2 :: [Int]

它有 0 个元素,其余的未定义。我们可以称它为空的部分列表。

另一种思考方式是p1[1,2] ++ undefined 相同,而p2[] ++ undefined 相同。

【讨论】:

    【解决方案3】:

    我在函数式编程简介中找到了我的问题的答案。 | aka undefined 是一个部分列表(它们的归纳基础)

    【讨论】:

      猜你喜欢
      • 2010-11-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-04-27
      • 1970-01-01
      • 1970-01-01
      • 2013-03-17
      相关资源
      最近更新 更多