2

如果我想用list.mlOCaml 编写,


第一季度

哪种方式是正确的?

type 'a list = 
  | Nil
  | Cons of 'a * ('a list)

或者

type 'a list = 
  | Nil
  | Cons of 'a * 'a list

有什么不同吗?


第二季度

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


第三季度

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

4

1 回答 1

7

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

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

let (!!) a b = Cons( a,b )

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

于 2013-07-09T16:18:38.563 回答