是否可以使用guards
在 where
之后定义一个函数是 haskell 吗?
这工作正常:
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 很陌生,所以非常欢迎任何解释!
最佳答案
您必须将守卫缩进到函数声明之后:
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 中不太含糊。您可以使用制表符,但我看到很多人因此而遇到解析错误。
关于 haskell : using guards after where,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23436343/