Haskell向我抛出57 - 未定义变量“f”错误

时间:2012-05-15 07:43:56

标签: haskell

我有一个简单的问题。 Haskell向我抛出57 - 未定义变量“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 ) ]

2 个答案:

答案 0 :(得分: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子句仅适用于紧接在子句之前的行。

答案 1 :(得分:10)

问题是内部where子句附加到行

eval' (Id id) = 5

但上面一行需要它

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

通常,函数定义的每一行都有自己的范围。 where子句可以引用它附加到的行中的模式变量,并且仅覆盖该行的其余部分。