Я переводил следующий код Haskell в OCaml:
data NFA q s = NFA
{ intialState :: q
, isAccepting :: q -> Bool
, transition :: q -> s -> [q]
}
Сначала я попробовал очень дословный перевод:
type ('q,'s) nfa = NFA of { initialState: 'q;
isAccepting: 'q -> bool;
transition: 'q -> 's -> 'q list }
... и, конечно, это дает синтаксическую ошибку, потому что часть конструктора типа, "NFA of" не допускается. Должно быть:
type ('q,'s) nfa = { initialState: 'q;
isAccepting: 'q -> bool;
transition: 'q -> 's -> 'q list }
Это заставило меня задуматься, почему это так. Почему у вас не может быть конструктора типа для типа записи так же, как для типа кортежа (как показано ниже)?
type ('q, 's) dfa = NFA of ('q * ('q->bool) * ( 'q -> 's -> 'q list) )