0

簡単な質問があります。Haskell が 57 - Undefined variable "f" エラーをスローしていますが、その理由がわかりません。よろしければご覧いただければ幸いです。コード:

eval :: Expr -> Environment -> Float
eval expr env = eval' expr
    where
    eval' :: Expr-> Float
    eval' (Num num) = num
    eval' (App app exprs) = foldl1 (f) (map eval' exprs) -- **Line 57**
    eval' (Id id) = 5
        where
        f = getFunctionForApp app                    -- **f is here** 
        getFunctionForApp :: String -> (Float->Float->Float)
        getFunctionForApp "+" = (+)
        getFunctionForApp "-" = (-)
        getFunctionForApp "*" = (*)
        getFunctionForApp "/" = (/)
        getIdVal :: String -> Environment -> Float
        getIdVal id ((curId, val):envrs) 
            |curId == id = val
            | otherwise = getIdVal id envrs

タイプ定義:

data Expr = Num Float | Id String | App String [ Expr ]
           deriving (Eq, Ord, Show)
type Environment = [ ( String, Float ) ]
4

2 に答える 2

11

はっきりとは言えませが、コードを解読しようとした後、あなたは次のことを意味していたと思います:

eval :: Expr -> Environment -> Float
eval expr env = eval' expr 
    where eval' :: Expr -> Float 
          eval' (Num num) = num 
          eval' (App app exprs) = foldl1 (f) (map eval' exprs)
              where f = getFunctionForApp app -- that has to be in this line
          eval' (Id id) = 5 

(フォーマットされたコードで、それで十分だと確信しています。where句は、句の直前の行でのみ機能します)

于 2012-05-15T08:03:00.143 に答える
10

問題は、内側のwhere節が行に付いていることです

eval' (Id id) = 5

ただし、上記の行には必要です

eval' (App app exprs) = foldl1 (f) (map eval' exprs) -- **Line 57**

一般に、関数定義の各行には独自のスコープがあります。where句は、それが接続されている行からパターン変数を参照することができ、その行の残りの部分のみを対象とします。

于 2012-05-15T08:20:00.167 に答える