undefined
Haskell 中是否有部分列表?
我知道那[1,2:undefined]
是片面的,但是undefined
单独呢?
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
正如评论所指出的,您的问题不是很清楚,但让我们做一些假设。首先,您可能打算编写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] ++ undefined
p2
[] ++ undefined
我在函数式编程简介中找到了我的问题的答案。| 又名 undefined 是一个部分列表(他们的归纳基础)