ocaml 中的 ('an * 'a) 列表和 'an * 'a 列表有什么区别?

What is the difference between ('a * 'a) list and 'a * 'a list in ocaml?

我正在尝试删除 string * string list 类型的列表(其他函数需要其类型),但我不断收到类型不匹配错误。如果我将一个列表定义为 let a = [("a" , "b")], 当我将它传递给需要类型 string * string list:

的函数时出现错误
Error: This expression has type (string * string) list
       but an expression was expected of type string * string list

将其声明为 let a = ["a" , "b"] 时会发生同样的错误。为什么会这样?

('a * 'a) list('a * 'a) 元组的列表,而 'a * 'a list'a 的元组和 'a 的列表。

您误读了类型:类型应用程序比产品绑定得更紧,因此

string * string list

表示

string * (string list)

例如:

let x: string * string list = "a", ["b"]

相比
let y : (string * string) list = ["a", "b"; "c", "d"]