Типы, приведенные ниже, взяты из этого вопроса
(* contains an error, later fixed by the OP *)
type _ task =
| Success : 'a -> 'a task
| Fail : 'a -> 'a task
| Binding : (('a task -> unit) -> unit) -> 'a task
| AndThen : ('a -> 'b task) * 'a task -> 'b task
| OnError : ('a -> 'b task) * 'a task -> 'b task
type _ stack =
| NoStack : 'a stack
| AndThenStack : ('a -> 'b task) * 'b stack -> 'a stack
| OnErrorStack : ('a -> 'b task) * 'b stack -> 'a stack
type 'a process =
{ root: 'a task
; stack: 'a stack
}
Я относительно новичок в OCaml, но я никогда не видел, чтобы синтаксис :
использовался подобным образом.Например, я видел полиморфные типы, определенные следующим образом, с использованием синтаксиса of
type 'a expr =
| Base of 'a
| Const of bool
| And of 'a expr list
| Or of 'a expr list
| Not of 'a expr
. В исходном вопросе мне не очевидно, как варианты создаются, поскольку они выглядят как каждыйодин не принимает аргумент.Возьмите этот упрощенный пример
type 'a stack =
| Foo : int stack
| Bar : string stack
;;
type 'a stack = Foo : int stack | Bar : string stack
Попробуйте создать int stack
, используя Foo
Foo 5;;
Error: The constructor Foo expects 0 argument(s),
but is applied here to 1 argument(s)
Однако без аргумента
Foo;;
- : int stack = Foo
Хорошо, но гдеint
?Как хранить данные в этом типе?
В приведенной ниже программе OP он / она соответствует типам "обычно", например, Success value -> ...
или Fail value -> ...
.Опять же, как это значение создается, если конструктор вариантов не принимает аргумент?
let rec loop : 'a. 'a process -> unit = fun proc ->
match proc.root with
| Success value ->
let rec step = function
| NoStack -> ()
| AndThenStack (callback, rest) -> loop {proc with root = callback value; stack = rest }
| OnErrorStack (_callback, rest) -> step rest <-- ERROR HERE
in
step proc.stack
| Fail value ->
let rec step = function
| NoStack -> ()
| AndThenStack (_callback, rest) -> step rest
| OnErrorStack (callback, rest) -> loop {proc with root = callback value; stack = rest }
in
step proc.stack
| Binding callback -> callback (fun task -> loop {proc with root = task} )
| AndThen (callback, task) -> loop {root = task; stack = AndThenStack (callback, proc.stack)}
| OnError (callback, task) -> loop {root = task; stack = OnErrorStack (callback, proc.stack)}
Может ли кто-нибудь помочь мне заполнить пробел в моих знаниях?