免费注册 查看新帖 |

Chinaunix

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

haskell如何实现首尾相连的“环” [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-04-27 01:30 |只看该作者 |倒序浏览
haskell如何实现“环”——首尾相连

data Week = Monday | Tuesday | Wednesday | Thursday | Friday | Saturday | Sunday
        deriving (Show,Enum,Eq)

想要实现:next  Monday = Tuesday,next Tuesday = Wednesday...next Sunday应该是Monday,如此循环。

succ Sunday和pred Monday都是非法的
现在只能如下表达

next :: Week->Week
next x |x==Sunday = Monday
         |otherwise = succ x

能否有更一般更抽象的实现呢?

[ 本帖最后由 pass12163com 于 2009-4-27 01:33 编辑 ]

论坛徽章:
0
2 [报告]
发表于 2009-04-27 09:49 |只看该作者
这一个可以吗?
用cycle实现首尾相连

  1. week = [Mon, Tue, Wed, Thu, Fri, Sat, Sun]

  2. last.take n.cycle $ week
复制代码

论坛徽章:
0
3 [报告]
发表于 2009-04-27 10:03 |只看该作者
这个也可以

next :: Week -> Week
next x = toEnum $ mod (fromEnum x + 1) 7

论坛徽章:
0
4 [报告]
发表于 2009-04-27 10:45 |只看该作者
原帖由 izhier 于 2009-4-27 10:03 发表
这个也可以

next :: Week -> Week
next x = toEnum $ mod (fromEnum x + 1) 7



这个很棒。只需确定循环周期。

上例中的n是个问题。

论坛徽章:
0
5 [报告]
发表于 2009-04-27 11:09 |只看该作者
原帖由 bengshi 于 2009-4-27 10:45 发表
上例中的n是个问题。


效率太低了

论坛徽章:
0
6 [报告]
发表于 2009-04-27 16:28 |只看该作者
谢谢各位的回复。
用mod的确够一般化,只是看起来像用的数组下标概念,少了FP的意味。

[ 本帖最后由 pass12163com 于 2009-4-27 16:33 编辑 ]

论坛徽章:
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
7 [报告]
发表于 2009-04-27 17:43 |只看该作者
原帖由 pass12163com 于 2009-4-27 01:30 发表
data Week = Monday | Tuesday | Wednesday | Thursday | Friday | Saturday | Sunday
        deriving (Show,Enum,Eq)

想要实现:next  Monday = Tuesday,next Tuesday = Wednesday...next Sunday应该是Monday,如此循环。

succ Sunday和pred Monday都是非法的

你不应该 deriving Enum,而应该自己 instance Enum。

论坛徽章:
0
8 [报告]
发表于 2009-04-28 09:23 |只看该作者
原帖由 MMMIX 于 2009-4-27 17:43 发表
应该自己 instance Enum。

难道是:

  1. data Week = Mon | Tue | Wed | Thu | Fri | Sat | Sun
  2.         deriving (Show, Eq)

  3. instance Enum Week where
  4.   fromEnum day = case day of
  5.                                Mon -> 0
  6.                                Tue -> 1
  7.                                Wed -> 2
  8.                                Thu -> 3
  9.                                Fri -> 4
  10.                                Sat -> 5
  11.                                Sun -> 6
  12.                                 _   -> error "invalid value constructor"
  13.    
  14.   toEnum n = case n of
  15.                          -1 -> Sun
  16.                          0  -> Mon
  17.                          1  -> Tue
  18.                          2  -> Wed
  19.                          3  -> Thu
  20.                          4  -> Fri
  21.                          5  -> Sat
  22.                          6  -> Sun
  23.                          7  -> Mon
  24.                          _  -> error "invalid number"
复制代码

run

  1. *Main> succ Sun
  2. Mon
  3. *Main> pred Mon
  4. Sun
复制代码

[ 本帖最后由 izhier 于 2009-4-28 09:36 编辑 ]

论坛徽章:
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
9 [报告]
发表于 2009-04-28 13:05 |只看该作者
原帖由 izhier 于 2009-4-28 09:23 发表

难道是:

data Week = Mon | Tue | Wed | Thu | Fri | Sat | Sun
        deriving (Show, Eq)


实现 toEnum 的时候对其参数先取模。

论坛徽章:
0
10 [报告]
发表于 2009-04-28 13:15 |只看该作者
原帖由 MMMIX 于 2009-4-28 13:05 发表
实现 toEnum 的时候对其参数先取模。


应该是
toEnum n = case n `mod` 7 of
这样写
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP