【问题标题】:Haskell : using guards after whereHaskell:在 where 之后使用警卫
【发布时间】:2014-06-19 14:55:57
【问题描述】:

where 是 Haskell 之后是否可以使用 guards 定义函数?

这很好用:

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 &lt; 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 很陌生,因此非常欢迎任何解释!

【问题讨论】:

    标签: haskell where let


    【解决方案1】:

    你必须在你的函数声明之后缩进守卫:

    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 中它们不那么模棱两可。您可以使用选项卡,但我看到很多人因此遇到解析错误。

    【讨论】:

    • 使用制表符缩进的一点是它们本身就可以,但是混合制表符和空格会导致误导情况(例如,三个空格在视觉上看起来比两个制表符缩进少得多,但实际上更多的)。而且由于您的文件几乎肯定会包含空格,因此必须使用制表符。
    • 我通常将letwhere 放在各自的行中,除非整个范围很容易放在一行中。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-04-09
    • 2017-05-08
    • 1970-01-01
    • 1970-01-01
    • 2012-10-30
    • 2015-02-24
    • 1970-01-01
    相关资源
    最近更新 更多