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

问题描述 投票:0回答:1

我试图在类型为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,不是吗?

ocaml typeerror
1个回答
2
投票

这个表达式:

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

有一个功能类型。 List.fold_left有3个参数,你只在这里传递2个。

编译器说你正在提供一个函数类型(pExp list -> pExp list),其中需要一个非函数类型(pExp list)。这确实是问题所在。

很可能你遗漏了函数和lst之间的初始值。

© www.soinside.com 2019 - 2024. All rights reserved.