我有以下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
| ^
答案 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。