Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.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 zip函数的几个问题_List_Zip_Pattern Matching_Tuples_Sml - Fatal编程技术网

List 关于sml zip函数的几个问题

List 关于sml zip函数的几个问题,list,zip,pattern-matching,tuples,sml,List,Zip,Pattern Matching,Tuples,Sml,我是sml新手,现在我正在尝试定义一个zip函数,它将两个列表作为一个元组。 这是代码。 我让它工作了,但我有几个问题 exception Mismatch; fun zip ([],[]) = [] | zip ((x::xs),(y::ys)) = (x, y)::zip (xs, ys) | zip (_, _) = raise Mismatch; 我可以在zip函数中定义异常吗?比如,我尝试过让它结束,但总是出错 另一个问题是关于第二个模式匹配,我写道 zip ([x::xs],

我是sml新手,现在我正在尝试定义一个zip函数,它将两个列表作为一个元组。 这是代码。 我让它工作了,但我有几个问题

exception Mismatch;
fun zip ([],[])    = []
| zip ((x::xs),(y::ys)) = (x, y)::zip (xs, ys)
| zip (_, _) = raise Mismatch;
我可以在zip函数中定义异常吗?比如,我尝试过让它结束,但总是出错

另一个问题是关于第二个模式匹配,我写道

zip ([x::xs],[y::ys]) = (x, y)::zip (xs, ys)
也给了我错误

Zip使用一个元组,但每个元素都是list,为什么我不能像其他list一样使用[x::xs]

最后一个问题,在模式匹配中,顺序重要吗?我想是的,我改变了顺序,出现了错误,只是想确认一下


谢谢

您不应该在
let中定义异常。。。在里面结束
*。它使得在
let
-表达式之外无法通过名称捕获它

*:如果您不打算让它从
let
-表达式中逃逸,这没关系,但您确实计划在这里这样做

至于你的另一个问题:

当您编写
[…]
时,SML编译器将其理解为“包含
..
的列表”

例如,
[1]
是包含
1
的列表,
[4,6,2]
是包含
4
6
2
的列表,等等

当您编写
x::xs
时,SML编译器将其理解为“以
x
开头的列表,后跟列表
xs

例如,
1::[]
是以1开头的列表,后跟空列表,
4::[6,2]
是以4开头的列表,后跟
6
2
,依此类推

现在,当您编写
[x::xs]
时,您正在将两者结合起来,SML将其理解为:“包含以
x
开头的列表,然后是
xs

因此,通过编写
[…]
而不是
(…)
,您要求的是另一个列表中的列表。这不是你想要的

最后一个问题:是的,顺序很重要。模式是按自上而下的顺序检查的。所以,

fun foo _ = 4
  | foo 4 = 5
将始终返回
4
,而

fun foo 4 = 5
  | foo _ = 4

当给出
4
时,将返回
5

非常感谢您的解释,因此[x::xs]表示列表中有两个元素,x和xs?
x::xs
表示包含一个或多个元素的列表
x
是一个元素,
xs
是剩余的列表。