免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 3674 | 回复: 5
打印 上一主题 下一主题

haskell 中“选择”的想法 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-12-20 09:44 |只看该作者 |倒序浏览
最近突然想到这个问题,在 haskell 中,可以用 pattern matching ,也可以用 if 来实现不“选择分支”结构,有什么不同呢?
于是作了个实验。


代码如下

diff1 :: Int -> Int
diff1 x
        | x < 0 = 0
        | otherwise = 1

diff2 :: Int -> Int
diff2 x =
        if x < 0
        then 0
        else 1

-- diff3 :: Int -> Int
-- diff3 x =
--         case x of
--           x < 0 -> 0
--           x >= 0 -> 1


发现, diff1 和 diff2 的运行结果是一样的。但是是 diff3 会报语法错。
这样看起来, diff1 的方法更方便,更简捷一些,而且可以避免多个 if 的嵌套,只是要考虑从上到下匹配的问题。
欢迎各位拍砖。

论坛徽章:
95
程序设计版块每日发帖之星
日期:2015-09-05 06:20:00程序设计版块每日发帖之星
日期:2015-09-17 06:20:00程序设计版块每日发帖之星
日期:2015-09-18 06:20:002015亚冠之阿尔艾因
日期:2015-09-18 10:35:08月度论坛发贴之星
日期:2015-09-30 22:25:002015亚冠之阿尔沙巴布
日期:2015-10-03 08:57:39程序设计版块每日发帖之星
日期:2015-10-05 06:20:00每日论坛发贴之星
日期:2015-10-05 06:20:002015年亚冠纪念徽章
日期:2015-10-06 10:06:482015亚冠之塔什干棉农
日期:2015-10-19 19:43:35程序设计版块每日发帖之星
日期:2015-10-21 06:20:00每日论坛发贴之星
日期:2015-09-14 06:20:00
2 [报告]
发表于 2008-12-20 10:19 |只看该作者

回复 #1 drunkedcat 的帖子

diff1 那个不叫 pattern matching,而叫 guard,实际上就是个嵌套的 if/elseif。在 diff3 那倒是需要个 pattern,可你又没写,当然是语法错误了。

[ 本帖最后由 MMMIX 于 2008-12-20 10:25 编辑 ]

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
3 [报告]
发表于 2008-12-20 10:20 |只看该作者
case of 本来就不是这么用的。
case of 只能用来做模式匹配。

你如果非要用 case of 的话,可以这么写:
  1. case x of
  2.     _ | x < 0 -> 0
  3.       | x >= 0 -> 1
复制代码

论坛徽章:
0
4 [报告]
发表于 2008-12-21 17:35 |只看该作者
多谢楼上各位,学习了。

论坛徽章:
0
5 [报告]
发表于 2008-12-21 21:00 |只看该作者
另外guard能做的判断比if少。

论坛徽章:
95
程序设计版块每日发帖之星
日期:2015-09-05 06:20:00程序设计版块每日发帖之星
日期:2015-09-17 06:20:00程序设计版块每日发帖之星
日期:2015-09-18 06:20:002015亚冠之阿尔艾因
日期:2015-09-18 10:35:08月度论坛发贴之星
日期:2015-09-30 22:25:002015亚冠之阿尔沙巴布
日期:2015-10-03 08:57:39程序设计版块每日发帖之星
日期:2015-10-05 06:20:00每日论坛发贴之星
日期:2015-10-05 06:20:002015年亚冠纪念徽章
日期:2015-10-06 10:06:482015亚冠之塔什干棉农
日期:2015-10-19 19:43:35程序设计版块每日发帖之星
日期:2015-10-21 06:20:00每日论坛发贴之星
日期:2015-09-14 06:20:00
6 [报告]
发表于 2008-12-22 15:27 |只看该作者
原帖由 Magicloud 于 2008-12-21 21:00 发表
另外guard能做的判断比if少。

嗯,guard 后不允许 exp0 :: [context =>] type 这种形式的表达式。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP