guards在whereHaskell 之后是否可以使用定义函数?
这很好用:
myMax a b = a + b - myMin a b
where myMin a b = if a < b then a else b
Run Code Online (Sandbox Code Playgroud)
但是这个
myMax a b = a + b - myMin a b
where myMin a b
| a < b = a
| otherwise = b
Run Code Online (Sandbox Code Playgroud)
将在ghci中抛出以下错误消息:
parse error (possibly incorrect indentation or mismatched brackets)
Run Code Online (Sandbox Code Playgroud)
在对应的行上 | a < b = a
同样,这将工作:
myMax a b =
let myMin a b = if a < b then a else b
in a + b - myMin a b
Run Code Online (Sandbox Code Playgroud)
但这不会:
myMax a b =
let myMin a b
| a < b = b
| otherwise = a
in a + b - myMin a b
Run Code Online (Sandbox Code Playgroud)
我的猜测是因为使用guards并不实际定义变量,即使它是where和let/in结构所需要的?我对Haskell很新,所以非常欢迎任何解释!
bhe*_*ilr 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
Run Code Online (Sandbox Code Playgroud)
或者作为
myMax a b =
let myMin x y
| x < y = x
| otherwise = y
in a + b - myMin a b
Run Code Online (Sandbox Code Playgroud)
如果你使用标签来缩进,我强烈建议使用空格,它们与Haskell的关系不那么模糊.您可以使用选项卡,但我发现很多人因此而遇到解析错误.