Как получить доступ к члену в списке на Ocaml
У меня есть исходный код ниже. Я не понимаю его синтаксис. [g | t <- ts; g <- symbols t]
очень странно Пожалуйста, помогите мне объяснить это или порекомендуйте любые книги или документы, которые соответствуют этому. большое спасибо
type term = V of string | F of string * term list
let rec symbols = function
| V x -> [x]
| F (f, ts) -> f :: [ g | t <- ts; g <- symbols t ]
let rec functions = function
| V _ -> []
| F (f, ts) -> f :: [ g | t <- ts; g <- functions t ]
1 ответ
Это нестандартный синтаксис для понимания списка. Я не знаю ни одной книги, которая документирует это. Идея состоит в том, что он должен напоминать нотацию построителя множеств. Короче говоря, это выражение будет оценено следующим образом:
[ x | p <- expr; p * 2 - 1 ]
где expr
следует оценить в списки, p
будет назначен на соответствующие элементы списка, так что p * 2 - 1
будет применяться к каждому элементу исходного списка.
В обычном синтаксисе OCaml это может быть выражено как
List.map (fun p -> p * 2 + 1) xs
В заключение, я бы не советовал вам использовать эту нотацию понимания списка. Во-первых, он не имеет инструментальной поддержки и, во всяком случае, не распространен в современном OCaml.
PS а пример выражения
f :: [ g | t <- ts; g <- symbols t ]
в ванили OCaml есть
f :: List.(map symbols ts |> concat)