0

ラムダ式を使用している場合、幸せなプロダクションルールでその場で式の値を計算することはできません。

たとえば、このコード

Exp   : let var '=' Exp in Exp  { \p -> $6 (($2,$4 p):p) }
      | 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 `div` $3 p }
      | Factor                  { $1 }

Factor            
      : int                     { \p -> $1 }
      | var                     { \p -> case lookup $1 p of
                                    Nothing -> error "no var"
                                     Just i  -> i }
      | '(' Exp ')'             { $2 }

http://www.haskell.org/happy/doc/html/sec-using.htmlからは機能しません。

または、より正確には、エラー メッセージが表示されました

No instance for (Show ([(String, Int)] -> Int))
      arising from a use of `print'
    Possible fix:
      add an instance declaration for (Show ([(String, Int)] -> Int))
    In a stmt of an interactive GHCi command: print it

何を変更しなければならないかを説明していただければ幸いです。

ラムダ式と環境変数 p と関係があるはずです。

データ型を使用しているときは、すべて問題ありません。

4

1 に答える 1

8

ここで注意すべきことは、このパーサーの結果は、変数バインディングの環境を取る関数であるということです。エラーメッセージは基本的に、おそらく環境を渡すのを忘れたために、関数を出力できないことを伝える GHCi です。

> eval "1 + 1"

空の環境を渡す必要がある場合

> eval "1 + 1" []

または、事前定義された変数を持つもの

> eval "x + x" [("x", 1)]
于 2012-10-16T17:55:02.603 に答える