当我尝试编译我的ML程序时,我收到一条错误说:"运营商和操作数不同意"。
candidates.sml:78.8-78.40 Error: operator and operand don't agree [tycon mismatch]
operator domain: int * (int * 'Z * 'Y) list
operand: int * (int * real) list
in expression:
tr (n,candidates)
我理解错误但我无法找到解决方案。 我收到错误的代码部分是:
fun agonas fileName =
let
fun tr(n,[])=[]
| tr(n,((a,b,c)::d))=((n-a+1),b,c)::(tr(n,d))
val (n,l,candidates) = parse fileName
val cand = tr(n,candidates)
in
my_solution(l,cand)
end;
,候选人与以下部分有关:
fun parse file =
let
(* a function to read an integer from an input stream *)
fun next_int input =
Option.valOf (TextIO.scanStream (Int.scan StringCvt.DEC) input)
(* a function to read a real that spans till the end of line *)
fun next_real input =
Option.valOf (TextIO.inputLine input)
(* open input file and read the two integers in the first line *)
val stream = TextIO.openIn file
val n = next_int stream
val l = next_int stream
val _ = TextIO.inputLine stream
(* a function to read the pair of integer & real in subsequent lines *)
fun scanner 0 acc = acc
| scanner i acc =
let
val d = next_int stream
val (SOME v) = Real.fromString (next_real stream)
in
scanner (i - 1) ((d, v) :: acc)
end
in
(n, l, rev(scanner n []))
end;
fun my_solution ( n , l ,candidates ) = [2 ,3 ,5 ,4 ,6]
fun agonas fileName = my_solution ( parse fileName )
如果你能找到错误,我将不胜感激。谢谢你。
答案 0 :(得分:0)
错误消息说明了一切:违规行调用trans
,这是一个需要两个参数的函数,第二个是三元组列表。但是,您传递的是对的列表(由您的scanner
函数生成)。
您没有向我们展示trans
功能,因此我无法更具体地说明适当的修复方法。
答案 1 :(得分:0)
问题在于parse
使用scanner
构建了一对对象列表 - (int * real) list
- 而tr
期望获得三元组列表 - {{1} }。
不知道(int * 'Z * 'Y) list
应该做什么,快速而肮脏的修复就是改变
tr
进入
tr(n,((a,b,c)::d))=((n-a+1),b,c)::(tr(n,d))
但这可能是错误的解决方案 - 这取决于代码应该做什么。
(有时候自己明确地写出类型 - 甚至在编写代码之前 - 而不是依靠类型推断来捕捉你需要做更多思考的地方。)