... where ...
不是表达式。where
与绑定相关联,而不是表达式。
您可以使用let
: let f = (+) in foldr f 0 [1,2]
,或者您可以将它与一些绑定一起使用:x = foldr f 0 [1,2] where f = (+)
。
以下是您编辑的代码的语法有效版本(它仍然损坏,但这不再是语法问题:-))。您只想为where
每个绑定使用一个,并且您希望where
比函数的主体缩进更多。
cprod = foldr f [[ ]]
where
f xs yss = foldr g [ ] xs
g x zss = foldr h zss yss
h ys uss = (x : ys) : uss
再看一遍,我发现我误解了您的代码——您有 3 个where
s,因为您希望每个 s 都应用于前面的函数。where
在这种情况下,您必须按照我所说的方式缩进s,例如
cprod = foldr f [[ ]]
where f xs yss = foldr g [ ] xs
where g x zss = foldr h zss yss
where h ys uss = (x : ys) : uss
如果你坚持这样使用where
并且不喜欢深度缩进的代码,你可以使用显式{}
/;
而不是布局。一个极端的情况是
{
cprod = foldr f [[ ]]
where { f xs yss = foldr g [ ] xs
where { g x zss = foldr h zss yss
where { h ys uss = (x : ys) : uss } } }
}
但这通常不被认为是好的风格。