haskell : using guards after where

标签 haskell where-clause let

是否可以使用guardswhere 之后定义一个函数是 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/

相关文章:

javascript - Javascript 中的 block 作用域、函数作用域和局部作用域

haskell - 来自实例的约束推断

mysql - SELECT * FROM WHERE 未找到所有记录

python - Numpy根据mask生成全局数组的子集

Swift 1.2 在初始化后分配 let

scheme - 以降序生成卢卡斯数列表(使用 let)

haskell - 返回相同类型类的两种类型之一

haskell - 为什么 haskell 编译器可以推断出这种类型,而 ghci 不能?

haskell - 在类型列表上映射依赖类型

php - MySQL 查询分组依据和位置