Вторая переменная должна быть добавлена ​​в определение типа задачи, чтобы выразить отдельные значения успеха и ошибки. Вот полное решение:

следующие виды:

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 
}

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)}

Я получаю ошибку от компилятора:

Ошибка: это выражение имеет стек типа b # 1, но ожидалось выражение типа стек. Конструктор типа b # 1 покинул бы область видимости.

В этой строке кода:

| 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

Потребовалось время, чтобы продвинуться так далеко, не наткнувшись на неясное сообщение об ошибке, которое неизбежно исправляется с помощью некоторых типов помощников, но я не могу понять, как исправить эту проблему с помощью помощника, или если я пытаюсь сделать что-нибудь глупое с моими типами.

Как правильно устранить эту ошибку?

Ответы на вопрос(2)

Ваш ответ на вопрос