哈斯克尔:在哪里使用警卫

Nio*_*urf 3 haskell where let

guardswhereHaskell 之后是否可以使用定义函数?

这很好用:

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并不实际定义变量,即使它是wherelet/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的关系不那么模糊.您可以使用选项卡,但我发现很多人因此而遇到解析错误.