免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: pass12163com
打印 上一主题 下一主题

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

论坛徽章:
0
11 [报告]
发表于 2009-04-28 14:36 |只看该作者
查了些资料也没明白instance Enum和deriving Enun的差别.......能否详解?

感觉这样绕了个弯,还不如直接枚举next Mon = Tue.....next Sun =  Mon
previous Mon = Sun....previous Sun

请赐教。

论坛徽章:
0
12 [报告]
发表于 2009-04-28 14:50 |只看该作者
instance Enum Week
是把Week类型声明为Enum类,也就是实现Enum类中声明函数的重载
只需定义最小组合的函数集,其他的系统会自动生成(因为其他函数是使用这些最小组合的函数来定义的)

deriving Enun
系统自动生成 Enum instance,重载函数
但这里重载的函数是系统默认的,并没有自定义的灵活(定义自己想要的功能)

对了
deriving 有一个限制:
In the case of constructors with arguments, the types of these arguments
must also be instances of any derived classes.
就是 instance 的 构造函数的参数也必须属于 derived classes

不知以上说得对不对,只是自己的理解

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

论坛徽章:
0
13 [报告]
发表于 2009-04-28 14:55 |只看该作者
想问一下: deriving (Class) 是不是语法糖 ?

论坛徽章:
0
14 [报告]
发表于 2009-04-28 15:24 |只看该作者
谢谢详解,清晰了。
只需定义最小组合的函数集,其他的系统会自动生成(因为其他函数是使用这些最小组合的函数来定义的)

其实在本例中,由于只涉及到succ  pred或者next  previous,所以重新定义哪怕是“最小的函数集合”,也没有多少甜头。不知我这样理解对不对......

deriving (Class)是不是语法糖,这个我也没有见到过确切的文字。但我认为不是。

论坛徽章:
0
15 [报告]
发表于 2009-04-28 15:40 |只看该作者
在 Prelude 模块中的 Enum 的 succ  pred 函数定义是这样的:

  1. succ                  = toEnum . (1+)       . fromEnum
  2. pred                  = toEnum . subtract 1 . fromEnum
复制代码

我们可以看到 succ 和 pred 两个函数是怎样定义的(调用 toEnum 和 fromEnum 函数)
所以我们只定义 toEnum 和 fromEnum 这两个函数,其他的都依赖于这两个函数定义
这样,我们就减少了代码量(无须定义其他函数)

如果我们想要的不是这样的定义,而是另一个 succ,那么我们完全可以自己利用 instance 来覆盖这个定义

当然,也可以覆盖 toEnum 和 fromEnum 这两个“最小的函数集合”

前面8楼的定义就是只覆盖了toEnum 和 fromEnum 这两个“最小的函数集合”。

通过改变 toEnum 和 fromEnum 这两个函数,进而改变 succ 和 pred 等 Enum 类的其他函数

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

论坛徽章:
0
16 [报告]
发表于 2009-04-28 15:43 |只看该作者
我们 instance 后(8楼), succ 函数的功能既是你要的 next 函数

为何如此说:
原帖由 pass12163com 于 2009-4-28 15:24 发表
也没有多少甜头

论坛徽章:
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
17 [报告]
发表于 2009-04-28 15:55 |只看该作者
原帖由 pass12163com 于 2009-4-28 15:24 发表
谢谢详解,清晰了。

其实在本例中,由于只涉及到succ  pred或者next  previous,所以重新定义哪怕是“最小的函数集合”,也没有多少甜头。

你想要啥甜头?

BTW,其实你可以重新定义个和 Enum 类似的 class, 例如叫做 EEnum, 然后 deriving 这个 EEnum。

论坛徽章:
0
18 [报告]
发表于 2009-04-28 15:59 |只看该作者
呵呵,只是单纯从构建next的代码规模来说的,并无它意。
不过我想在instance的基础上重新考虑一些问题,那时可能会有很多甜头吧。

论坛徽章:
0
19 [报告]
发表于 2009-04-28 16:03 |只看该作者
感觉 instance 实现更优雅一些,更具 FP 特色

论坛徽章:
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
20 [报告]
发表于 2009-04-28 16:36 |只看该作者
原帖由 izhier 于 2009-4-28 14:55 发表
想问一下: deriving (Class) 是不是语法糖 ?

不是。如果是的话,deriving 也就不会有那么多限制了。

[ 本帖最后由 MMMIX 于 2009-4-28 16:38 编辑 ]
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP