Вы можете легко интерпретировать эти типы, если вы понимаете тип (char list -> ('r*char list) list)
как черный ящик.
Предположим, у нас есть сокращение типа:
type R<'r> = char list -> ('r*char list) list
Тогда Parser<'r>
можно записать как:
type Parser<'r> = Parser of R<'r>
Когда вы объявляете функцию:
let parse (Parser p) = p
средство проверки типов выводит параметр типа Parser<'r>
(просматривая структуру Parser p
). Следовательно, возвращаемое значение p
, очевидно, имеет тип R<'r>
:
val parse : Parser<'a> -> R<'a>
Гипотетически, заменяя R<'r>
его действительным объявлением:
val parse : Parser<'r> -> (char list -> ('r*char list) list)
Так что типы, выведенные здесь, полностью имеют смысл.