为什么使用List.fold_left返回值时出现类型错误?

时间:2019-04-09 03:21:53

标签: ocaml typeerror

我试图在类型为pExp(用户定义类型)的列表上使用从List.fold_left返回的列表。这样做的目的是创建一个Times列表(pExp列表),该列表以Plus l类型匹配。

let eval (lst: pExp list): pExp list = 
    match lst with
    | [] -> []
    | other patterns
    | Plus l::t -> (List.fold_left (fun acc a -> Times(a::t)::acc) lst)
    (* For each item a in l, append it to t and make it a Times *)
    | _ -> []

我希望List.fold_left返回一个pExp列表,但出现此错误。

Error: This expression has type pExp list -> pExp list but an expression was expected of type pExp list 错误消息的第一行指示fold_left返回一个pExp,它恰好是所期望的,不是吗?

1 个答案:

答案 0 :(得分:2)

此表达式:

(List.fold_left (fun acc a -> Times(a::t)::acc) lst)

具有功能类型。 List.fold_left接受3个参数,而您只在这里传递2个参数。

编译器说您正在提供应为非函数类型(pExp list -> pExp list)的函数类型(pExp list)。确实是问题所在。

您很有可能在函数和lst之间遗漏了初始值。