Haskell - Счастливая ошибка парсера
Я работаю над проектом, который использует генератор счастливого парсера. Вот что я сделал до сих пор:
Exp : Exp1 { $1 }
Exp1 : Exp1 '+' Term { \p -> $1 p + $3 p }
| Exp1 '-' Term { \p -> $1 p - $3 p }
| Term { $1 }
Term : Term '*' Factor { \p -> $1 p * $3 p }
| Term '/' Factor { \p -> $1 p / $3 p }
| sqrt Factor { \p -> sqrt $2 p }
| Factor { $1 }
Factor
: double { \p -> $1 }
| '(' Exp ')' { $2 }
Проблема в том, что я получаю следующую ошибку:
Parser.hs:158:38:
No instance for (Floating ([a0] -> Double))
arising from a use of `happyReduction_7'
Possible fix:
add an instance declaration for (Floating ([a0] -> Double))
In the second argument of `happySpecReduce_2', namely
`happyReduction_7'
In the expression: happySpecReduce_2 6 happyReduction_7
In an equation for `happyReduce_7':
happyReduce_7 = happySpecReduce_2 6 happyReduction_7
Вы знаете, как я могу решить это?
Обновление: я решил это, но теперь это работает, только если я пишу "sqrt2"(без пробела между sqrt и 2); если я пишу "sqrt 2", я получаю "ошибку разбора".
Вот что у меня есть в файле Alex(lex):
tokens :-
$white+ ;
"--".* ;
"sqrt" { \s -> TokenSqrt}
"sin" { \s -> TokenSin}
"log" { \s -> TokenLog}
@doubleNumber { \s -> TokenDouble (read s) }
@var { \s -> TokenVar s }
"+" { \s -> TokenPlus }
"-" { \s -> TokenMinus }
"*" { \s -> TokenMul }
"/" { \s -> TokenDiv }
"(" { \s -> TokenOB }
")" { \s -> TokenCB }
"=" { \s -> TokenEq }
1 ответ
sqrt $2 p
Это звонки sqrt
с функцией $2
в качестве аргумента, а затем применяет полученную функцию к аргументу p
, Это имеет смысл, только если sqrt
может взять функцию и произвести функцию в результате, что будет иметь место, если и только если бы был Floating
экземпляр для функций, которых там нет. Таким образом сообщение об ошибке.
То, что вы, несомненно, намеревались сделать, это применить функцию $2
к аргументу p
а затем применить sqrt
к результату, для которого вы бы написали:
sqrt ($2 p)