错误SML NJ-Operator和操作数不同意

时间:2014-06-18 21:29:59

标签: ml

当我尝试编译我的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 )

如果你能找到错误,我将不胜感激。谢谢你。

2 个答案:

答案 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))

但这可能是错误的解决方案 - 这取决于代码应该做什么。

(有时候自己明确地写出类型 - 甚至在编写代码之前 - 而不是依靠类型推断来捕捉你需要做更多思考的地方。)