Ocaml - 此表达式具有类型'列表,但表达式需要类型&a; a类型变量' a出现在列表中

时间:2015-03-31 23:28:58

标签: recursion ocaml

为什么下面的代码会给我这个错误? 请注意,is_sorted函数返回true或false 和make_move函数返回列表列表。例如[[0,1,3,2],[1,0,2,3]]

let rec solve_helper b pos n r fn =
    if n = 0 then b :: r :: fn (*fn is the final array with all paths*)
    else match pos with
        [] -> fn
       |(h::t) -> if is_sorted h = true then h
        else h :: r (* ERROR HERE: r is the temp array that contains 1 path*)
             solve_helper  b (make_moves h) (n-1) r
             solve_helper b t (n-1) r (*tail recursion*)
;;

let solve_board b n = solver_helper b (make_moves b) n [] []
;;

新代码:

let rec solve_helper b pos n r fn =
    if n = 0 then r :: fn (*fn is the final array with all paths*)
    else match pos with
        [] -> fn
       |(h::t) -> if is_sorted h = true then 
            let j = h :: r in
            r :: fn
        else
            let u = h :: r in
            let  k = solve_helper b (make_moves h) (n - 1) r fn in
            solve_helper b t (n - 1) r fn(*tail recursion*)
;;

let solve_board b n = solve_helper b (make_moves b) n [] []
;;

1 个答案:

答案 0 :(得分:0)

您的代码的这些行:

    else h :: r (* ERROR HERE: r is the temp array that contains 1 path*)
         solve_helper  b (make_moves h) (n-1) r
         solve_helper b t (n-1) r (*tail recursion*)
据我所知,

没有意义。它们表示对名为r的函数的调用,该函数有10个参数(其中两个是函数r本身)。

可能您需要编辑代码以准确显示编译器所看到的内容。

如果您的代码实际上是这样的,则需要重新考虑此部分。它读起来就像命令式代码(一系列要做的事情)而不是功能代码(由应用于参数的函数组成的表达式)。