首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >理解- Haskell中嵌套的if-条件

理解- Haskell中嵌套的if-条件
EN

Stack Overflow用户
提问于 2014-04-20 17:52:16
回答 2查看 174关注 0票数 0

我试着熟悉haskell中的if条件语句。

假设我有一个参数x,我在haskell中尝试了下面的内容

代码语言:javascript
复制
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”上的解析错误。

我怎样才能解决这个问题?如果-其他条件不对吗?

代码语言:javascript
复制
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>0=.X<0=.因为我想说,举个例子,-4也是平的。因此,第一个声明应该处理正偶数,第二个声明应该处理负偶数。

当我将其交给编译器时,就会出现消息: Exception。我在哪里犯了这个错误?

EN

回答 2

Stack Overflow用户

发布于 2014-04-20 18:00:44

每个if都需要一个与其关联的else子句。

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

代码语言:javascript
复制
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
票数 1
EN

Stack Overflow用户

发布于 2014-04-20 18:10:34

因此,我们的想法是从x中减去5,检查结果是否为0,如果是,则给出一个1。如果不是,则用x-5表达式再次调用函数。如果x-5的结果为负值,则给出0。

可能是这样写的:

代码语言:javascript
复制
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都需要一个else和一个then

所以,我想有可能决定一个给定的数字是偶数。所以,我对你的解决方案做了一点修改。这是一样的,但是,在两个声明的开头我说:x>0=.X<0=.因为我想说,举个例子,-4也是平的。因此,第一个声明应该处理正偶数,第二个声明应该处理负偶数。

首先,在函数的第二个版本中,where子句中的定义应该是z = x + 2,因为z = z + 2不会终止。这是一个均匀度测试,您还希望在x而不是z上执行测试。有了这个解决方案,使用嵌套条件的解决方案应该工作得很好(但是,请注意,您没有处理x == 0案例;第一个保护应该是x >= 0)。不过,还有一种更优雅的编写函数的方法:

代码语言:javascript
复制
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的绝对值是避免编写两个几乎相等的分支来处理负和非负情况的最简单方法。

注:虽然这可能只是一个学习练习,但如果您需要找到一个数字是否甚至有一个even函数可以从前奏曲中获得。如果需要测试其他数字的可分性,也可以使用mod

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23185768

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档