【发布时间】:2015-01-29 09:35:40
【问题描述】:
我有一个非常简单的代码,它应该将一个元组列表 (int * string) 转换为两个列表,一个整数列表和一个字符串列表 - 基本上是一个元组列表到一个列表元组。
fun unzip_single_int[] : int list = []
| unzip_single_int(x::xs) : int list =
x :: unzip_single_int(xs)
fun unzip_single_string[] : string list = []
| unzip_single_string(x::xs) : string list =
x :: unzip_single_string(xs)
fun unzip[] : (int list * string list) = ([], [])
| unzip([twopls]) : (int list * string list) =
let
val x : int list = unzip_single_int(twopls);
val y : string list = unzip_single_string(twopls); (* this is line 28 btw *)
in
(x, y)
end
还有错误:
zip.sml:28.7-28.52 Error: operator and operand don't agree [tycon mismatch]
operator domain: string list
operand: int list
in expression:
unzip_single_int twopls
由于某种原因,编译器认为 val y : string list = unzip_single_string(twopls) 指的是一个 int 列表。
有趣的是,当我将两者切换时,当我改变时:
val x : int list = unzip_single_int(twopls);
val y : string list = unzip_single_string(twopls);
到
val y : string list = unzip_single_string(twopls);
val x : int list = unzip_single_int(twopls);
错误也切换:
zip.sml:28.7-28.47 Error: operator and operand don't agree [tycon mismatch]
operator domain: int list
operand: string list
in expression:
unzip_single_int twopls
出于某种原因,无论第二次调用是什么,它都会假定它是最后一次调用的类型。为什么要这样做?我该如何克服呢?我在另外两个函数定义中说得很清楚,它们分别是int列表和字符串列表,那为什么SML在我明确定义为int列表时却认为我发送的是字符串列表?
谢谢!
【问题讨论】:
-
很高兴他们在错误消息中使用了非常有用的术语“tycon”!
标签: sml type-mismatch