理解 - Haskell中的嵌套if条件

时间:2014-04-20 17:52:16

标签: haskell

我尝试熟悉haskell中的if-condition语句

假设我有一个参数x,我在haskell中尝试以下

functionname x = if x > 0 then x-5
                          if x-5 == 0 then 1
                          else if x-5 /= 0 then functionname x-5
                          else if x-5 <  then 0

所以,想法是从x中减去5,检查结果是否为0,如果是,则给出1。 如果没有,则使用表达式x-5再次调用该函数。 如果x-5的结果为负,则给出0。

所以,我的问题:那会是正确的吗?因为当我尝试这个时,我在输入'functionname'上有一个像解析错误的消息。

我该如何解决这个问题? if-else条件是错误的吗?


programm :: Int -> Bool

programm x |  x > 0 =
   if z == 0 then True
   else if z < 0 then False
   else programm z
   where
   z = z-2

programm x |  x < 0 =
   if z == 0 then True
   else if z > 0 then False
   else programm z
   where
   z = z+2

所以,我想有可能决定一个给定的数字是偶数。所以,我稍微修改你的解决方案。它是相同的但是,在我说的两个声明的开头:x&gt; 0 = ....并且x < 0 = ...... 因为我想说例如-4也是偶数。因为这个原因:第一个声明应该处理正数偶数,第二个声明处理负数偶数。

当我将它提供给编译器时,会显示消息:Exception。我犯了哪个错误?

3 个答案:

答案 0 :(得分:4)

使用警卫来澄清事情:

functionname x
  | x > 0      = x - 5
  | x - 5 == 0 = 1
  | x - 5 /= 0 = functionname (x - 5)
  | x - 5 < 0  = 0

答案 1 :(得分:1)

每个if都需要有一个else子句。

第一个没有,最后一个也没有。 这很好用:

functionname x = if x > 0 then x-5
                 else if x-5 == 0 then 1
                 else if x-5 /= 0 then functionname x-5
                 else if x-5 < 0 then 0 else 1

答案 2 :(得分:1)

  

所以,想法是从x中减去5,检查结果是否为0,if   是的,然后给1.如果没有,那么再次调用该函数   表达式x-5。如果x-5的结果为负,则给出0。

这可能是这样写的:

functionname x =
    if x' == 0 then 1
    else if x' < 0 then 0
    else functionname x'
    where
    x' = x - 5

在这里,我使用where子句将x'本地定义为x - 5,然后将其用于测试和递归调用。你的第一个分支if x > 0 then x-5没有出现在你应该做什么的描述中(当x大于零时,它会得到x - 5个结果,这可能不是你想要的结果。另请注意,每个if都需要elsethen

  

所以,我想有可能决定一个给定的数字   甚至。所以,我稍微修改你的解决方案。它是一样但是,在   我说的两个声明的开头:x&gt; 0 = ....并且x < 0   = ...因为我想说例如-4也是偶数。因为这个原因:第一个声明应该处理正数偶数   第二个声明处理负数偶数。

首先,在函数的第二个版本中,where子句中的定义应为z = x + 2,因为z = z + 2不会终止。这是一个均匀度测试,您还希望在x而不是z上执行测试。修复后,您的嵌套条件解决方案应该可以正常工作(但请注意,您没有处理x == 0案例;第一个警卫应该是x >= 0)。但是,有一种更优雅的方式来编写函数:

myEven :: Int -> Bool
myEven x = myEven' (abs x)
    where
    myEven' x
        | x == 0    = True
        | x < 0     = False
        | otherwise = myEven' (x - 2)

abs是熟悉的绝对值函数,而myEven'相当于原始定义的x > 0分支。取x的绝对值是避免编写两个几乎相等的分支来处理负面和非负面情况的最简单方法。

N.B。:虽然这可能只是一个学习练习,如果您需要查找数字是否均匀,Prelude中有even功能。如果您需要测试其他数字的可分性,还有mod