2014-12-11 2 views
0

После реализации простого анализатора в Haskell я проверил следующий примерный код для проверки моего parer.Неисчерпывающие шаблоны в ошибке лямбда

example = fst $ (\(Just x)->x) $ parse (tokenize "assign x := not(and(true, false)); print x; assign a := not(and(x, x)); print a; end;") :: Stmt 

и возвращает Exception: Parse.hs: 93: 18-29: неисчерпывающему модели в лямбда

Что я здесь делаю неправильно, что может быть причиной этой ошибки?

ответ

3

Вы в конечном итоге кормление Nothing в лямбду (\(Just x) -> x), вызывая неисчерпывающую ошибку соответствия картины. Вместо этого используйте maybe функцию:

default_value :: Stmt 
default_value = ??? 

maybe default_value fst $ parse (tokenize "...") :: Stmt 
+0

Если я знаю, что строка, которую я обрабатываю, не должна возвращать ошибка, значит ли это, что я неправильно реализовал парсер? – user3277633

+0

@ user3277633 Это единственное предположение, которое я могу сделать. Это единственный шаблон, который у вас есть в коде, который вы указали, если это ошибка, то вы получаете «ничего» из своего парсера. – bheklilr

2

В вашей лямбде (\(Just x)->x) вам необходимо учесть, что ее аргумент может быть Nothing.

Попробуйте это:

hdlr (Just x) = x 
hdlr Nothing = error "Failed" 

example = fst $ hdlr $ parse (tokenize "assign x := not(and(true, false)); print x; assign a := not(and(x, x)); print a; end;") :: Stmt 
+0

Если я знаю, что я строка разбора не должна возвращать ошибку, это значит, что где-то я реализовал синтаксический анализатор не так? – user3277633

+0

Да, вы ничего не передаете в лямбду, попробуйте с кодом, который я поставил выше, и вы увидите довольно быстро, если вы получите ошибку «Failed» или нет. –