在guards
是Haskell后,是否可以使用where
来定义函数?
这很好用:
myMax a b = a + b - myMin a b
where myMin a b = if a < b then a else b
但是这个
myMax a b = a + b - myMin a b
where myMin a b
| a < b = a
| otherwise = b
将在ghci中抛出以下错误消息:
parse error (possibly incorrect indentation or mismatched brackets)
在与| a < b = a
同样,这将有效:
myMax a b =
let myMin a b = if a < b then a else b
in a + b - myMin a b
但这不会:
myMax a b =
let myMin a b
| a < b = b
| otherwise = a
in a + b - myMin a b
我的猜测是,因为使用guards
实际上并没有定义变量,即使where
和let/in
结构需要它?我对Haskell很新,所以非常欢迎任何解释!
答案 0 :(得分:11)
你必须在你的职能声明之后缩进警卫:
myMax a b = a + b - myMin a b
where myMin x y -- Also, use different variable names here to avoid conflicts
| x < y = x
| otherwise = y
或作为
myMax a b =
let myMin x y
| x < y = x
| otherwise = y
in a + b - myMin a b
如果您使用标签进行缩进,我强烈建议使用空格,它们与Haskell的关系不那么模糊。您可以使用选项卡,但我发现很多人因此而遇到解析错误。