New*_*ewb 4 null list sml smlnj
我对新泽西州SML解释列表的方式有疑问:
假设我有一个功能f(x : 'a, n : int) : 'a list,使得f返回列表n的副本x,例如f(2,5) = [2,2,2,2,2],f(9,0) = [].
那么我进入REPL,然后检查f(9,0) = nil,它返回true.由此,我假设你可以list = nil用来检查a是否list是空列表.我在一个函数中使用它,它不会运行.我最后得知类型定义不同:
sml:121.2-123.10错误:运算符和操作数不一致[需要相等类型]运算符域:''Z*''Z
操作数:
表达式中的'a list*'Y列表:
xs = nil
(其中xs是我的名单).然后我了解到检查列表是否为空列表的方法是null list.为什么会这样?发生了什么事nil?有人可以向我解释这种行为吗?
我还注意到,显然(case xs = of nil与检查相同null xs.这是否意味着nil是一种类型?
这是与多态性相关的错误.默认情况下,评估空列表时,它具有类型'a list.这意味着列表可以包含任何类型的元素.如果您尝试评估1::[],则不会因此而出现类型错误.这称为多态,它是一个允许函数接受任何类型参数的功能.这在函数中很有用null,因为在这种情况下你不关心列表的内容,你只关心它的长度(事实上,你只关心它是否为空).但是,您也可以使用不同类型的空列表.您可以使函数返回一个空的int列表.事实上,你在你的功能中这样做.
这是您的功能的简单实现的结果:
- fun f(x : 'a, n : int) : 'a list =
case n of
0 => []
| _ => x::f(x, n-1);
val f = fn : 'a * int -> 'a list
- f(4,5);
val it = [4,4,4,4,4] : int list
- f(4,0);
val it = [] : int list
Run Code Online (Sandbox Code Playgroud)
如您所见,即使第二个参数为0,您的函数也会返回一个int列表.您应该能够直接将其与类型列表进行比较'a list.
- it = [];
val it = true : bool
Run Code Online (Sandbox Code Playgroud)
但是,如果您尝试比较具有不同类型且不是类型的两个空列表,则'a list应该收到错误.你可以在下面看到它的一个例子:
- [];
val it = [] : 'a list
- val list1 : int list = [];
val list1 = [] : int list
- val list2 : char list = [];
val list2 = [] : char list
- list1 = [];
val it = true : bool
- list2 = [];
val it = true : bool
- list1 = list2;
stdIn:6.1-6.14 Error: operator and operand don't agree [tycon mismatch]
operator domain: int list * int list
operand: int list * char list
in expression:
list1 = list2
Run Code Online (Sandbox Code Playgroud)
另外,case xs of nil是一种检查列表是否为空的方法,但这是因为nil(这只是一种写入方式[])'a list默认情况下具有该类型.(注意case表达式不直接返回一个布尔值.)因此,nil不是一个类型,而是'a list一个多态类型,你可以与任何类型的列表进行比较,但如果你的空列表没有多态类型,你会得到一个类型错误,我认为你的情况会发生什么.
| 归档时间: |
|
| 查看次数: |
4481 次 |
| 最近记录: |