haskell如何实现首尾相连的“环”

发布于 2022-08-20 21:55:00 字数 569 浏览 18 评论 9

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 编辑 ]

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(9

冷心人i 2022-08-22 10:39:01

原帖由 MMMIX 于 2009-4-28 13:05 发表
实现 toEnum 的时候对其参数先取模。


应该是
toEnum n = case n `mod` 7 of
这样写

风苍溪 2022-08-22 10:36:39

原帖由 izhier 于 2009-4-28 09:23 发表

难道是:

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

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

最美的太阳 2022-08-22 10:35:43

原帖由 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 编辑 ]

ヅ她的身影、若隐若现 2022-08-22 10:35:20

原帖由 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。

北城挽邺 2022-08-22 10:17:49

谢谢各位的回复。
用mod的确够一般化,只是看起来像用的数组下标概念,少了FP的意味。

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

挽手叙旧 2022-08-22 10:16:04

原帖由 bengshi 于 2009-4-27 10:45 发表
上例中的n是个问题。


效率太低了

辞旧 2022-08-22 06:19:03

原帖由 izhier 于 2009-4-27 10:03 发表
这个也可以

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

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

上例中的n是个问题。

酒解孤独 2022-08-22 04:22:40

这个也可以

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

浪菊怪哟 2022-08-21 04:23:42

这一个可以吗?
用cycle实现首尾相连

  1. week = [Mon, Tue, Wed, Thu, Fri, Sat, Sun]
  2. last.take n.cycle $ week

复制代码

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文