Error handling ML.“;“解压缩”;元组列表。
所以我有一个元组列表(n=2),我应该“解压”这样创建一个新的列表:对于像val这样的元组列表,它=(1,“一”):(2,“二”)::nil:(int,string)alterlist,解压函数将创建一个像这样的列表[(1,2),(“一”,“二”)]。 到目前为止,我得到的是:Error handling ML.“;“解压缩”;元组列表。,error-handling,tuples,ml,operand,Error Handling,Tuples,Ml,Operand,所以我有一个元组列表(n=2),我应该“解压”这样创建一个新的列表:对于像val这样的元组列表,它=(1,“一”):(2,“二”)::nil:(int,string)alterlist,解压函数将创建一个像这样的列表[(1,2),(“一”,“二”)]。 到目前为止,我得到的是: datatype ('a, 'b) alterlist = nil | :: of ('a*'b) * ('a, 'b) alterlist; infixr 5 :: fun build4(x, one, y, t
datatype ('a, 'b) alterlist = nil | :: of ('a*'b) * ('a, 'b) alterlist;
infixr 5 ::
fun build4(x, one, y, two) = (x,one)::((y,two)::nil);
fun unzip(alterlist) =
let
fun extract([], i) = []
| extract((x,y)::xs, i) = if i=0 then x::extract(xs, i)
else y::extract(xs, i);
in
(extract(alterlist, 0))::(extract(alterlist, 1))
end;
但我有很多错误:
stdIn:48.6-50.26 Error: parameter or result constraints of clauses don't agree [tycon mismatch]
this clause: ('Z,'Y) alterlist * 'X -> 'W
previous clauses: 'V list * 'U -> 'W
in declaration:
extract =
(fn (nil,i) => nil
| (<pat> :: <pat>,i) =>
if <exp> = <exp> then <exp> :: <exp> else <exp> :: <exp>)
stdIn:49.41-49.58 Error: operator and operand don't agree [tycon mismatch]
operator domain: 'Z list * 'Y
operand: ('X,'W) alterlist * int
in expression:
extract (xs,i)
stdIn:50.9-50.26 Error: operator and operand don't agree [tycon mismatch]
operator domain: 'Z list * 'Y
operand: (_ * _,'X) alterlist * int
in expression:
extract (xs,i)
stdIn:48.6-50.26 Error: right-hand-side of clause doesn't agree with function result type [tycon mismatch]
expression: (_,_) alterlist
result type: 'Z list
in declaration:
extract =
(fn (nil,i) => nil
| (<pat> :: <pat>,i) =>
if <exp> = <exp> then <exp> :: <exp> else <exp> :: <exp>)
stdIn:48.6-50.26错误:子句的参数或结果约束不一致[tycon失配]
本条款:('Z,'Y)alterlist*'X->'W
以前的条款:“V list*”U->“W
在声明中:
提取=
(fn(nil,i)=>nil
|(:,i)=>
if=then::else::)
stdIn:49.41-49.58错误:运算符和操作数不一致[tycon不匹配]
运算符域:“Z列表*”Y
操作数:('X,'W)交替列表*int
在表达上:
摘录(xs,i)
stdIn:50.9-50.26错误:运算符和操作数不一致[tycon不匹配]
运算符域:“Z列表*”Y
操作数:(*X,'X)alterlist*int
在表达上:
摘录(xs,i)
stdIn:48.6-50.26错误:条款右侧与功能结果类型不一致[tycon不匹配]
表达式:(u,u)替换列表
结果类型:“Z列表”
在声明中:
提取=
(fn(nil,i)=>nil
|(:,i)=>
if=then::else::)
由于我是ml的新手,我几乎不知道是什么导致了它。非常感谢您的帮助 我的建议是,首先不要使用中缀操作符,因为它有点混乱。 先解决它,然后再添加 下面是一个没有中缀的解决方案:
datatype ('a,'b)alterlist = Nil
| element of 'a*('b,'a)alterlist;
fun unzip (Nil : ('a,'b)alterlist ) = ([],[])
| unzip (ablist : ('a,'b)alterlist) =
let
fun extract Nil = []
| extract (element (curr, Nil)) = curr::[]
| extract (element (curr, element(_,rest))) = curr::(extract rest)
val element (_, balist) = ablist
in
(extract ablist, extract balist)
end;
例如,这样的列表:[“a”,1,“b”,2]将由以下人员创建:
element ("a", element (1, element ("b", element (2, Nil))));
给你:
val it = element ("a",element (1,element #)) : (string,int) alterlist
*#只是表示列表比显示的长
然后如果你想尝试解压它代码>
你会得到:
val it = (["a","b"],[1,2]) : string list * int list
如你所愿
现在尝试将元素更改为::中缀运算符
祝你好运 欢迎@BobSacamano,但如果答案对你有帮助,请将其标记为答案(复选标记)。@BobSacamano,答案附近有一个复选标记。单击它,然后单击它旁边的向上箭头。我选中了它,但我没有足够的街头信誉来投票支持你的答案。