免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 5393 | 回复: 7

自动类型推导的作用 [复制链接]

论坛徽章:
0
发表于 2009-03-15 18:18 |显示全部楼层
我看过一些带自动类型推导的语言的介绍,包括 ML 和 Haskell。它们都强调了自动类型推导减轻了程序员的负担,因为你不必每个函数都写上类型签名。但另一方面,它们又说:写上类型签名好处多多。

我觉得这两个说法是熊掌和鱼,不能兼得。它们这样说,有虚假广告的嫌疑。

个人觉得还是应该写上签名。解释器或编译器其实并不轻信我们的签名,它还会用自动推导来核对。我觉得这才是自动类型推导真正有意义的地方。

大家以为如何?

论坛徽章:
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
发表于 2009-03-15 18:48 |显示全部楼层
原帖由 win_hate 于 2009-3-15 18:18 发表
我看过一些带自动类型推导的语言的介绍,包括 ML 和 Haskell。它们都强调了自动类型推导减轻了程序员的负担,因为你不必每个函数都写上类型签名。但另一方面,它们又说:写上类型签名好处多多。

我觉得这两个说法是熊掌和鱼,不能兼得。它们这样说,有虚假广告的嫌疑。

也不能这么说。许多时候做快速原型开发的时候,完全可以不写类型而尽量依赖自动推导。这就好像 Perl 的词法变量,在你写一些一次性脚本的时候完全可以不用,但在做工程性开发的时候最好还是尽量用
个人觉得还是应该写上签名。解释器或编译器其实并不轻信我们的签名,它还会用自动推导来核对。我觉得这才是自动类型推导真正有意义的地方。

这只是一方面,类型还可以起到文档的作用,Haskell 的许多函数,你只要看它的类型,往往就能猜到它的语义,更不要说能了解它的用法了。

论坛徽章:
0
发表于 2009-03-15 18:55 |显示全部楼层
关于自动推导,资料上是这样写的

1. First, every well-typed expression is guaranteed to have a unique principal type(explained below),

2. the principal type can be inferred automatically.

An expression's or function's principal type is the least general type that, intuitively, "contains all instances of the expression". For example, the principal type of head is [a]->a, not ->a.


这样看来,如果我把签名都写上,编译器是不是就不需要类型推导了?只要按我给出的签名检验是否冲突就可以了?

论坛徽章:
0
发表于 2009-03-15 18:58 |显示全部楼层
>> 这只是一方面,类型还可以起到文档的作用,Haskell 的许多函数,你只要看它的类型,往往就能猜到它的语义,更不要说能了解它的用法了。


是有这个作用。

论坛徽章:
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
发表于 2009-03-15 18:59 |显示全部楼层
原帖由 win_hate 于 2009-3-15 18:55 发表
关于自动推导,资料上是这样写的



这样看来,如果我把签名都写上,编译器是不是就不需要类型推导了?只要按我给出的签名检验是否冲突就可以了?

它不推导怎么知道你有没有写对?

论坛徽章:
0
发表于 2009-03-15 19:02 |显示全部楼层
原帖由 MMMIX 于 2009-3-15 18:59 发表

它不推导怎么知道你有没有写对?


比如 c 语言,一个表达式最终也能算出一个类型来,但这个应该不是我们所说的“自动类型推导”。

我觉得部分类型没有给出的前提下才需要  infer.

论坛徽章:
0
发表于 2009-03-15 20:01 |显示全部楼层
原帖由 win_hate 于 2009-3-15 18:55 发表
这样看来,如果我把签名都写上,编译器是不是就不需要类型推导了?只要按我给出的签名检验是否冲突就可以了?

检查有无冲突叫type checking类型检查,和type inference类型推导有很大差别
强大的type inference可以简化编写工作量,更重要的是,有力支持了polymorphic type机制

论坛徽章:
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
发表于 2009-03-15 20:05 |显示全部楼层
原帖由 win_hate 于 2009-3-15 19:02 发表


比如 c 语言,一个表达式最终也能算出一个类型来,但这个应该不是我们所说的“自动类型推导”。

嗯,这个是检查类型是否匹配。
我觉得部分类型没有给出的前提下才需要  infer.

没错。若是全部的类型信息都给出了,只需要检查是否匹配就可以了。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP