Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/visual-studio-code/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
List SML-NJ列表等于零与空列表_List_Null_Sml_Smlnj - Fatal编程技术网

List SML-NJ列表等于零与空列表

List SML-NJ列表等于零与空列表,list,null,sml,smlnj,List,Null,Sml,Smlnj,我对新泽西州的SML解释列表的方式有一个疑问: 假设我有一个函数f(x:'a,n:int):'a list,使得f返回x的n副本列表,例如f(2,5)=[2,2,2,2,2,2],f(9,0)=[] 然后我进入REPL,检查f(9,0)=nil,它返回true。由此,我假设您可以使用list=nil来检查list是否为空列表。我在函数中使用了它,但它不会运行。我最终了解到类型定义是不同的: sml:121.2-123.10错误:运算符和操作数不一致[需要相等类型] 运算符域:''Z*''Z 操作

我对新泽西州的SML解释列表的方式有一个疑问:

假设我有一个函数
f(x:'a,n:int):'a list
,使得
f
返回
x
n
副本列表,例如
f(2,5)=[2,2,2,2,2,2]
f(9,0)=[]

然后我进入REPL,检查f(9,0)=nil,它返回true。由此,我假设您可以使用
list=nil
来检查
list
是否为空列表。我在函数中使用了它,但它不会运行。我最终了解到类型定义是不同的:

sml:121.2-123.10错误:运算符和操作数不一致[需要相等类型] 运算符域:''Z*''Z
操作数:“a列表*”Y列表
在表达式中:
xs=nil

(其中xs是我的列表)。然后我了解到,检查列表是否为空列表的方法是使用
null list
。为什么会这样?
nil
怎么了?有人能给我解释一下这种行为吗


我还注意到显然
(用例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
如您所见,即使第二个参数为0,您的函数也会返回一个int列表。您应该能够直接将其与类型为
'a list
的列表进行比较

- it = [];
val it = true : bool
但是,如果您尝试比较两个具有不同类型且不是列表类型的空列表,您应该会得到一个错误。您可以在下面看到一个示例:

- [];
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
另外,
case xs of nil
是一种检查列表是否为空的方法,但这是因为
nil
(这只是一种写入
[]
的方法)在默认情况下具有类型
'a list
(注意,case表达式不直接返回布尔值)因此,
nil
不是一种类型,但是
'a list
是一种多态类型,您可以与任何类型的列表进行比较,但是如果您的空列表没有多态类型,您将得到一个类型错误,我想在您的情况下会发生这种情况