Хорошо, я думаю, что могу понять ваш вопрос. Структура данных, начинающаяся с функции, является функцией! В OCaml функции — это объекты первого класса, и вы можете создавать новые, хранить их в структурах данных и т. д. Чтобы сохранить чистоту, вы не можете получить доступ к текстовому представлению функции (как это возможно в некоторых языках), но вы все равно можете комбинировать функции полезными способами.
Вот крошечный пример. Функция maketest
принимает значение k
и возвращает функцию, которая проверяет k
.
# let maketest k = fun x -> x = k;;
val maketest : 'a -> 'a -> bool = <fun>
# let t8 = maketest 8;;
val t8 : int -> bool = <fun>
# t8 3;;
- : bool = false
# t8 8;;
- : bool = true
Функция union
принимает две тестовые функции (подобные тем, что сгенерированы maketest
) и возвращает функцию, которая проверяет объединение двух наборов значений:
# let union f g = fun x -> f x || g x;;
val union : ('a -> bool) -> ('a -> bool) -> 'a -> bool = <fun>
# let t812 = union t8 (maketest 12);;
val t812 : int -> bool = <fun>
# t812 8;;
- : bool = true
# t812 12;;
- : bool = true
# t812 14;;
- : bool = false
#
Функция sequence
принимает две проверочные функции (подобные тем, что сгенерированы maketest
) и проверяет список, начинающийся с целых чисел, который по очереди соответствует двум функциям.
# let sequence f g = function
| []|[_] -> false
| a :: b :: _ -> f a && g b;;
val sequence : ('a -> bool) -> ('a -> bool) -> 'a list -> bool = <fun>
# sequence (maketest 1) (maketest 4) [1;4;7];;
- : bool = true
# sequence (maketest 1) (maketest 4) [1;8;7];;
- : bool = false
#
Я не совсем уверен, но я думаю, что вас просят создать что-то вроде этих функций для компонентов вашей грамматики. Чтобы сделать синтаксический анализатор из подобных функций, вам нужно будет отслеживать свой прогресс во входном потоке. Обычным способом было бы заставить функции синтаксического анализа возвращать оставшийся (не проанализированный) поток.
person
Jeffrey Scofield
schedule
26.01.2013