未定义的变量,Haskell

时间:2011-10-26 16:39:52

标签: haskell

我有一个简单的问题。哈斯克尔向57 - Undefined variable "f" error投掷了我,我不知道为什么。如果你能看一下,我会很感激。

代码:

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 :(得分:9)

where块仅适用于它之前的情况,而不适用于eval'函数的所有情况。因此feval' (Id id) = 5被定义(但未使用),但它不在第57行的范围内。要修复此问题,您需要在第57行之后直接移动where块。

答案 1 :(得分:3)

究竟是什么sepp2k说的。在这种情况下,我更喜欢简单地交换第57和58行,因此where附加到正确的等式而不分割eval'的等式,这更可读。

或根本不使用f,将其设为

eval' (App app exprs) = foldl1 (getFunctionOrApp app) (map eval' exprs)
eval' (Id id) = 5

getFunctionOrApp :: String -> (Float -> Float -> Float)
getFunctionOrApp "+" = ...

getFunctionOrApp(和getIdVal)移动到与where相同的eval',在顶层定义它们甚至是合理的。