Sep. 29th, 2009

thedeemon: (Default)
Я летом писал про классические парсер-комбинаторы на Окамле и жаловался, что у меня не получилось сделать рекурсивные, вроде такого:

let rec p_exp =  p_char 'a' ||| (p_char '(' >>> p_exp >>> p_char ')')

Такой парсер должен разбирать строки 'a', '(a)', '((a))' и т.д., но ругаться на '((a)'.

При попытке компиляции приведенной строчки выдавалось малоинформативное сообщение This kind of expression is not allowed as right-hand side of `let rec'. Оказывается, все очень просто. В правой части let rec может быть очень ограниченный набор конструкций, если они содержат одно из рекурсивно определяемых имен. Одна из поддерживаемых - fun. Все начинает компилироваться и правильно работать, если обернуть правую часть в нее:

let rec p_exp = fun s -> (p_char 'a' ||| (p_char '(' >>> p_exp >>> p_char ')')) s

Profile

thedeemon: (Default)
Dmitry Popov

October 2025

S M T W T F S
   1234
567891011
12131415161718
19202122232425
262728 29 3031 

Most Popular Tags

Style Credit

Expand Cut Tags

No cut tags
Page generated Nov. 29th, 2025 05:10 pm
Powered by Dreamwidth Studios