Добре, мисля, че мога да разбера въпроса ви. Структура от данни, започваща с функция, е функция! В 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
) и тества за списък, започващ с ints, които съответстват на двете функции на свой ред.
# 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