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

时间:2014-05-02 20:22:59

标签: haskell where let

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实际上并没有定义变量,即使wherelet/in结构需要它?我对Haskell很新,所以非常欢迎任何解释!

1 个答案:

答案 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的关系不那么模糊。您可以使用选项卡,但我发现很多人因此而遇到解析错误。