Как получить доступ к члену в списке на 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)
Другие вопросы по тегам