如何在OCaml中编写列表?

Jac*_*ale 2 ocaml list

如果我想写list.mlOCaml,


Q1

哪种方式是正确的?

type 'a list = 
  | Nil
  | Cons of 'a * ('a list)
Run Code Online (Sandbox Code Playgroud)

要么

type 'a list = 
  | Nil
  | Cons of 'a * 'a list
Run Code Online (Sandbox Code Playgroud)

有什么区别?


Q2

另外,如何Cons将类型定义内部定义为::


Q3

如何Nil在类型定义中定义为[]

nlu*_*oni 7

Q1 - 没有区别; 每个都有两个与之相关的参数Cons.虽然Cons of ('a * 'a list)它是不同的,因为它有一个参数,一个元组.如果你构造一个元组并尝试将其包装在Cons中,那么你会发现它是一个重要的区别let x = a,Nil in Cons x.选择取决于您计划构建元素的方式或数据的某些语义.在这种特殊情况下,不应使用括号.

Q2 - 您不能使用:中缀函数名的第一个字符,因为它是该语言中::的关键字- 也是一个关键字,无论如何.通常,中缀运算符可以使用函数名称周围的括号定义,并且允许使用一组特殊的符号,

let (!!) a b = Cons( a,b )
Run Code Online (Sandbox Code Playgroud)

Q3 - 这需要命名一个标识符[],如let [] = Nil.命名约定中不允许使用这些字符(请参阅上面的相同链接),因为它们也是单独的关键字.