5

undefinedHaskell 中是否有部分列表?

我知道那[1,2:undefined]是片面的,但是undefined单独呢?

4

3 回答 3

12

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

ghci> :t undefined
undefined :: a

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

我不确定你是否真的想要:在你的例子中。

[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
于 2013-06-17T15:37:04.837 回答
2

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

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

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

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

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

另一种思考方式是,它与和isp1相同。[1,2] ++ undefinedp2[] ++ undefined

于 2013-06-17T19:06:57.400 回答
1

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

于 2013-06-23T01:39:56.243 回答