【发布时间】:2013-06-17 15:29:27
【问题描述】:
undefined 是 Haskell 中的部分列表吗?
我知道[1,2:undefined] 是部分的,但是单独的undefined 呢?
【问题讨论】:
-
我不知道“部分列表”的正式权威定义,但通常,
undefined在用于列表类型时被视为部分列表。 -
您能否定义一下部分列表是什么意思?
undefined 是 Haskell 中的部分列表吗?
我知道[1,2:undefined] 是部分的,但是单独的undefined 呢?
【问题讨论】:
undefined 在用于列表类型时被视为部分列表。
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
【讨论】:
1:2:undefined,考虑到1 :: Integer,未定义的类型不是Integer而是[Integer]。
正如 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 相同。
【讨论】:
我在函数式编程简介中找到了我的问题的答案。 | aka undefined 是一个部分列表(它们的归纳基础)
【讨论】: