如何使用Haskell if语句解决缩进问题

时间:2019-01-25 05:21:48

标签: haskell

我有以下Haskell代码:

f :: Int -> Int
f x =
  let var1 = there in
  case (there) of
    12 -> 0 
    otherwise | (there - 1) >= 4 -> 2
              | (there + 1) <= 2 -> 3

  where there = 6

仅此功能就是垃圾,请忽略其确切功能。

我想用if代替警卫

f x =
  let var1 = there in
  case (there) of
    12 -> 0 
    otherwise -> if (there - 1) >= 4 then 2
                    else if (there + 1) <= 2 then 3

  where there = 6

我尝试将if移至下一行,然后将其移至下一行,将它们排成一行,对其进行解联,但是似乎无济于事。

我收到一个解析错误,但我不知道如何解决:

    parse error (possibly incorrect indentation or mismatched brackets)
   |
40 |   where there = 6
   |   ^

1 个答案:

答案 0 :(得分:8)

您在这里有一些误解。让我们从原始代码开始逐步介绍它们:

f x =

一个函数定义,但是该函数从不使用参数x。严格来说,这是警告,而不是错误,但是大多数代码库都将使用-Werror,因此请考虑省略该参数或使用_来表明您明确忽略了该变量。

  let var1 = there in

这是不必要的-再次使用的不是var1(下面使用的是there),为什么呢?

  case (there) of

好的。或者只是case there of,不需要过多的括号来使代码混乱。

    12 -> 0

这里12是一个模式匹配项,很好。

    otherwise ->

在这里,您使用了变量名otherwise作为模式,该模式将无条件地匹配值there。这是另一条警告:otherwise是等于True的全局值,因此可以在防护中使用,例如function foo | foo < 1 = expr1 ; | otherwise = expr2。您的用法并非如此,使用otherwise作为模式会遮盖全局值。而是考虑使用下划线抓住所有模式:

_ -> if (there - 1) >= 4
         then 2
         else if (there + 1) <= 2
                 then 3
  where there = 6

好吧...如果there等于3怎么办? 3-1不大于4。3+1不小于2。if语句始终需要else。 Haskell中没有if {},而是if ... else ...与C中的三元运算符非常相似,为explained in the Haskell wiki