Как мне интерпретировать этот частичный синтаксис функции в f #? - PullRequest
2 голосов
/ 31 января 2012

Я читаю код f # и меня сбивает с толку синтаксис. Тип парсера вводится следующим образом:

type Parser<'r> = Parser of (char list -> ('r*char list) list)

Это оценивается переводчиком как:

type Parser<'r> = | Parser of (char list -> ('r * char list) list)

что имеет смысл для меня. Затем вводится новая строка кода: «Также необходимо применить функцию синтаксического анализа, поэтому мы определим для этого частичную функцию:» ​​и следующий код:

let parse (Parser p) = p

и вывод интерпретатора:

Parser<'a> -> (char list -> ('a * char list) list)

Я удивлен, что это даже правильный синтаксис. Что это и зачем это нужно?

Большое спасибо

Ответы [ 2 ]

9 голосов
/ 31 января 2012

В общем

let f шаблон = тело

эквивалентно

let f = function
| шаблон -> тело

или, еще более детально,

let f x =
match x with
| pattern -> body

Это позволяет избежать ввода нового идентификатора, который немедленно деструктурируется и затем никогда не используется снова.

В этом конкретном примере это означает, что parse эквивалентно:

let parse x = 
    match x with
    | Parser p -> p

Поскольку в типе Parser имеется только один случай, эта деструктуризация всегда будет успешной.

3 голосов
/ 31 января 2012

Вы можете легко интерпретировать эти типы, если вы понимаете тип (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)

Так что типы, выведенные здесь, полностью имеют смысл.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...