List 关于sml zip函数的几个问题
我是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],
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
是剩余的列表。