未定义变量Haskell

未定义变量Haskell,haskell,Haskell,我有一个简短的问题。Haskell向我抛出57-未定义变量“f”错误,我不知道为什么。如果你能看看这个,我将不胜感激 代码: 类型定义: data Expr = Num Float | Id String | App String [ Expr ] deriving (Eq, Ord, Show) type Environment = [ ( String, Float ) ] where块仅适用于它前面的情况,而不适用于eval'函数的所有情况。因此f在eval'(Id

我有一个简短的问题。Haskell向我抛出
57-未定义变量“f”错误,我不知道为什么。如果你能看看这个,我将不胜感激

代码:

类型定义:

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

where块仅适用于它前面的情况,而不适用于
eval'
函数的所有情况。因此
f
eval'(Id)=5中定义(但未使用),但不在第57行的范围内。要解决这个问题,您需要将where块直接移动到第57行之后。

正如sepp2k所说。不过,在本例中,我更喜欢简单地交换第57行和第58行,这样
中的
就可以附加到正确的等式,而不必拆分
eval'
的等式,这样更容易阅读

或者根本不使用
f
,让它

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

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

getFunctionOrApp
(和
getIdVal
)移动到与
eval'
相同的
级别,甚至可以在顶层定义它们。

老实说,我不知道答案,但我认为where块必须位于station之后。换句话说,你有没有试着把整个where块移到一行?或者在最后一行“eval”后面加上“f=…”——让where块嵌套在另一个where块中,我觉得很奇怪,尽管在某些情况下可能有很好的理由。@matrixprog:是的,有时有很好的理由嵌套
where
s;例如,如果手动应用“静态参数转换”。这里,嵌套的
,其中
用于使用模式中的值绑定为某个对象创建一个短名称,这也是一种常见用法。
eval' (App app exprs) = foldl1 (getFunctionOrApp app) (map eval' exprs)
eval' (Id id) = 5

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