免费注册 查看新帖 |

Chinaunix

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

[技术动态] 王垠:我和Google的故事 [复制链接]

论坛徽章:
1
2015年迎新春徽章
日期:2015-03-04 09:50:28
21 [报告]
发表于 2012-08-15 11:16 |只看该作者
那么,这么牛B的东西,在哪里能用到呢?

我用过的最好的python IDE(没有之一)是Wing IDE,慢是慢了点,但是静态推导出来的tag,那是相当的靠谱。
还写了个注册器,感觉有点对不起作者啊。

论坛徽章:
0
22 [报告]
发表于 2012-08-15 11:18 |只看该作者
本帖最后由 KanonInD 于 2012-08-15 11:25 编辑

回复 18# windoze


    s=eval(sys.readline())中的eval还是能写出类型的,是 eval :: String -> a,表示输入字符串得到任意类型a, 或者应该是 eval :: String -> IO a。
如果后面再跟一个 s = s + 1的话,那么任意类型a就成整数了。

论坛徽章:
44
15-16赛季CBA联赛之浙江
日期:2021-10-11 02:03:59程序设计版块每日发帖之星
日期:2016-07-02 06:20:0015-16赛季CBA联赛之新疆
日期:2016-04-25 10:55:452016科比退役纪念章
日期:2016-04-23 00:51:2315-16赛季CBA联赛之山东
日期:2016-04-17 12:00:2815-16赛季CBA联赛之福建
日期:2016-04-12 15:21:2915-16赛季CBA联赛之辽宁
日期:2016-03-24 21:38:2715-16赛季CBA联赛之福建
日期:2016-03-18 12:13:4015-16赛季CBA联赛之佛山
日期:2016-02-05 00:55:2015-16赛季CBA联赛之佛山
日期:2016-02-04 21:11:3615-16赛季CBA联赛之天津
日期:2016-11-02 00:33:1215-16赛季CBA联赛之浙江
日期:2017-01-13 01:31:49
23 [报告]
发表于 2012-08-15 13:34 |只看该作者
回复 23# KanonInD


    “任意类型”不是“一个类型”,“s=s+1”也不能保证接下来s就是整形。

论坛徽章:
2
青铜圣斗士
日期:2015-11-26 06:15:59数据库技术版块每日发帖之星
日期:2016-07-24 06:20:00
24 [报告]
发表于 2012-08-15 17:37 |只看该作者
noword2k 发表于 2012-08-15 11:16
那么,这么牛B的东西,在哪里能用到呢?

我用过的最好的python IDE(没有之一)是Wing IDE,慢是慢了点,但是静态推导出来的tag,那是相当的靠谱。
还写了个注册器,感觉有点对不起作者啊。


能静态推导出函数参数的类型么?

论坛徽章:
2
青铜圣斗士
日期:2015-11-26 06:15:59数据库技术版块每日发帖之星
日期:2016-07-24 06:20:00
25 [报告]
发表于 2012-08-15 18:00 |只看该作者
KanonInD 发表于 2012-08-15 11:18
回复 18# windoze

    s=eval(sys.readline())中的eval还是能写出类型的,是 eval :: String -> a,表示输入字符串得到任意类型a, 或者应该是 eval :: String -> IO a。
如果后面再跟一个 s = s + 1的话,那么任意类型a就成整数了。


1. eval :: String -> a vs eval :: String -> IO a
似乎这样更符合尽量剥离出纯函数的原则

  1. readline :: IO String
  2. eval :: String -> a
  3. eval `fmap` readline :: IO a -- eval(sys.readline())
复制代码
2. 无论是 String -> a 还是 String -> IO a,都与python的eval是不同的。

python的eval是eval函数自己决定返回类型。 而作为动态类型的python, 变量s可以接受任何类型。
而eval :: String -> a , 函数自己不能决定返回类型。类型是由调用方决定的。

  1. x <- (eval `fmap` readline)::Int -- 需要Int类型, eval将字符串按Int解析
  2. y <- (eval `fmap` readline)::String -- 需要String类型, eva将字符串按String解析
  3. s <- eval `fmap` readline -- 任意类型,意思是说此处没有任何约束,并不是指这里可以根据readline给出的不同输入产生不同类型。
  4. let s' = s+1 -- 进一步约束s必须是Num。
复制代码
最极端的例子: print eval(sys.readline())。 python可以根据getline获取的不同输出,用eval产生不同类型的结果,并用print输出。
但Haskell不行,至少eval :: String -> IO a这样的签名是肯定不行的。



所以,其实我也没明白对动态类型语言进行类型推导究竟是想做什么。

论坛徽章:
2
青铜圣斗士
日期:2015-11-26 06:15:59数据库技术版块每日发帖之星
日期:2016-07-24 06:20:00
26 [报告]
发表于 2012-08-15 18:21 |只看该作者
windoze 发表于 2012-08-15 13:34
回复 23# KanonInD
 “任意类型”不是“一个类型”,

一针见血。。。

eval :: String -> IO a 是任意类型,是对所有调用点说的。
但对某一个调用点,必须确定一个类型。

有点类似C语言的可变长参数。对所有调用点来说,它接受了不同个数的参数。
但对每一个调用点,参数个数必须是在编译时确定 —— 至少C层面只能做到这样。

论坛徽章:
0
27 [报告]
发表于 2012-08-15 18:43 |只看该作者
本帖最后由 KanonInD 于 2012-08-15 18:49 编辑
windoze 发表于 2012-08-15 13:34
回复 23# KanonInD

如果任意类型不是类型,那C++的stl的容器该怎办呢?s=s+1不能保证s的类型是因为鸭子类型的原因吗?

论坛徽章:
0
28 [报告]
发表于 2012-08-15 19:24 |只看该作者
本帖最后由 KanonInD 于 2012-08-16 12:45 编辑
OwnWaterloo 发表于 2012-08-15 17:37
能静态推导出函数参数的类型么?

能VS不能
  1. a = new SomeClass()

  2. def foo(a):
  3.   doSomething
复制代码
不能

  1. a = eval(sys.readline())
  2. def foo(a):
  3.   doSomething
复制代码
(怀疑)王垠在他的项目中修改了Python(的类型系统)。

论坛徽章:
44
15-16赛季CBA联赛之浙江
日期:2021-10-11 02:03:59程序设计版块每日发帖之星
日期:2016-07-02 06:20:0015-16赛季CBA联赛之新疆
日期:2016-04-25 10:55:452016科比退役纪念章
日期:2016-04-23 00:51:2315-16赛季CBA联赛之山东
日期:2016-04-17 12:00:2815-16赛季CBA联赛之福建
日期:2016-04-12 15:21:2915-16赛季CBA联赛之辽宁
日期:2016-03-24 21:38:2715-16赛季CBA联赛之福建
日期:2016-03-18 12:13:4015-16赛季CBA联赛之佛山
日期:2016-02-05 00:55:2015-16赛季CBA联赛之佛山
日期:2016-02-04 21:11:3615-16赛季CBA联赛之天津
日期:2016-11-02 00:33:1215-16赛季CBA联赛之浙江
日期:2017-01-13 01:31:49
29 [报告]
发表于 2012-08-15 21:56 |只看该作者
KanonInD 发表于 2012-08-15 18:43
如果任意类型不是类型,那C++的stl的容器该怎办呢?s=s+1不能保证s的类型是因为鸭子类型的原因吗?


“类型”才是(等价于)“类型”,“任意类型”不是(等价于)“类型”,公孙龙几千年前就解释过了。
STL容器是“类型模板(class/type template)”,例如std::vector,实例化之后才是“类型(class/type)”,例如std::vector<int>。
似乎翻译过来的书大多将“类(型)模板”或者“函数模板”翻译成“模板类(型)”或者“模板函数”,所以这个地方的误解会比较多吧。

动态类型语言的本质就是说一个变量的类型是在运行时确定的,所以才叫“动态类型”,如Python、Ruby、JavaScript

C/C++是静态类型语言,在编译器生成目标代码时,类型必须是确定的,而这个类型在运行时是不可变的,所以才叫“静态类型”。

对动态类型语言做静态类型分析不是完全不可行,但是要延后到运行时才有意义,例如v8就会在运行时对于特定的对象进行类型分析之后做JIT,所以它才会比早期没有JIT的JS引擎快。

脱离开运行期的信息做静态类型分析,效果比ctags之类的正则表达式匹配分析好不了多少。

论坛徽章:
0
30 [报告]
发表于 2012-08-16 18:12 |只看该作者
回复 30# windoze


    王垠在他的一篇博文 http://yinwang0.wordpress.com/2010/09/12/pysonar/ 中提到“PySonar parses the code into an AST and performs type inference on it”, AST 算运行期信息不?
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP