Functional programming 我能做'type';条目=字符串*';a*';条目;;`用OCaml?

Functional programming 我能做'type';条目=字符串*';a*';条目;;`用OCaml?,functional-programming,ocaml,Functional Programming,Ocaml,看来我不能 我想知道为什么我不能 可以肯定的是,我可以键入'a entry=Empty |字符串的值*'a*'a entry,所以如果我想递归定义一个类型,我只能走联合路线。你的问题令人困惑,因为它只提到了你不想使用的类型!但是,我从您的标题中看到,您希望使用直接递归类型 如果需要直接递归类型,则需要在命令行上启用-rectypes。然而,这并不是大多数时候你真正想做的事情。它允许太多的类型不是你想要的 $ ocaml OCaml version 4.00.0 # type '

看来我不能

我想知道为什么我不能


可以肯定的是,我可以
键入'a entry=Empty |字符串的值*'a*'a entry
,所以如果我想递归定义一个类型,我只能走
联合
路线。

你的问题令人困惑,因为它只提到了你不想使用的类型!但是,我从您的标题中看到,您希望使用直接递归类型

如果需要直接递归类型,则需要在命令行上启用
-rectypes
。然而,这并不是大多数时候你真正想做的事情。它允许太多的类型不是你想要的

$ ocaml
        OCaml version 4.00.0

# type 'a entry = string * 'a * 'a entry;;
Error: The type abbreviation entry is cyclic
# ^D
$ ocaml -rectypes
        OCaml version 4.00.0

# type 'a entry = string * 'a * 'a entry;;
type 'a entry = string * 'a * 'a entry
# 
默认情况下未启用
-rectypes
的原因是它允许将类型指定给许多实际上是编码错误的表达式。总的来说,额外的灵活性不值得放弃额外的错误检测

下面是我在旧的OCaml邮件列表消息中发现的一个示例:

$ ocaml -rectypes
        OCaml version 4.00.0

# let f x = x :: x;;
val f : ('a list as 'a) -> 'a list = <fun>
# 
$ocaml-矩形
OCaml版本4.00.0
#设fx=x::x;;
val f:('a列表为'a)->'a列表=
# 
-rectypes
打开时,这个相当荒谬的函数就被接受了。但实际上,它只适用于非常奇怪的列表类型。程序员很可能打算使用
@
而不是
将列表附加到自身。不幸的是,这个错误直到很久以后
-rectypes
打开时才会被检测到


作为旁白,正如newacct指出的,您可能很快就会发现标题中的类型没有那么有用。它实际上只能表示循环或无限结构。这是另一个原因,没有
-矩形工作并不太困难。

您的问题令人困惑,因为它只提到了您不想使用的类型!但是,我从您的标题中看到,您希望使用直接递归类型

如果需要直接递归类型,则需要在命令行上启用
-rectypes
。然而,这并不是大多数时候你真正想做的事情。它允许太多的类型不是你想要的

$ ocaml
        OCaml version 4.00.0

# type 'a entry = string * 'a * 'a entry;;
Error: The type abbreviation entry is cyclic
# ^D
$ ocaml -rectypes
        OCaml version 4.00.0

# type 'a entry = string * 'a * 'a entry;;
type 'a entry = string * 'a * 'a entry
# 
默认情况下未启用
-rectypes
的原因是它允许将类型指定给许多实际上是编码错误的表达式。总的来说,额外的灵活性不值得放弃额外的错误检测

下面是我在旧的OCaml邮件列表消息中发现的一个示例:

$ ocaml -rectypes
        OCaml version 4.00.0

# let f x = x :: x;;
val f : ('a list as 'a) -> 'a list = <fun>
# 
$ocaml-矩形
OCaml版本4.00.0
#设fx=x::x;;
val f:('a列表为'a)->'a列表=
# 
-rectypes
打开时,这个相当荒谬的函数就被接受了。但实际上,它只适用于非常奇怪的列表类型。程序员很可能打算使用
@
而不是
将列表附加到自身。不幸的是,这个错误直到很久以后
-rectypes
打开时才会被检测到


作为旁白,正如newacct指出的,您可能很快就会发现标题中的类型没有那么有用。它实际上只能表示循环或无限结构。这是另一个原因,在没有
-矩形
的情况下工作并不太困难。

当你做
键入某物=另一个类型
时,你在做一个类型同义词,就像C中的
typedef
。它生成一个别名,你可以用它作为引用另一个类型的快捷方式。它本身并不定义新类型。因此,它不能是递归的


当您输入something=someconstructor of…
时,它定义了一个新的代数数据类型。这可以是递归的

(Haskell和SML对此更清楚;他们使用
type
作为类型同义词,使用
data
(Haskell)/
datatype
(SML)定义新的代数数据类型。)

代数数据类型不一定需要有多个备选方案。这在语法上是有效的

type 'a entry = Value of string * 'a * 'a entry

但是,在这种情况下,这可能没有什么用处,因为它如何结束?

当您执行
type something=other type
时,您正在执行一个类型同义词,如C中的
typedef
。它生成一个别名,您可以将其用作引用其他类型的快捷方式。它本身并不定义新类型。因此,它不能是递归的


当您输入something=someconstructor of…时,它定义了一个新的代数数据类型。这可以是递归的

(Haskell和SML对此更清楚;他们使用
type
作为类型同义词,使用
data
(Haskell)/
datatype
(SML)定义新的代数数据类型。)

代数数据类型不一定需要有多个备选方案。这在语法上是有效的

type 'a entry = Value of string * 'a * 'a entry

但是,在这种情况下,这可能是没有用的,因为它如何结束?

在命令行的option
-rectypes
启用递归类型。在命令行的option
-rectypes
启用递归类型。实际上,这种类型只适用于循环结构。流的类型(无限列表)应该是
type'a entry=string*'a*(unit->'a entry)
对于像OCaml这样的严格语言是正确的,但是我想的更一般一些(有点)。实际上,这种类型只适用于循环结构。流的类型(无限列表)应该是
type'a entry=string*'a*(unit->'a entry)
对于像OCaml这样的严格语言是正确的,但是我想的更一般一些(有点)。