如果哪里不正确,请指出,改之
原帖由 win_hate 于 2009-3-31 21:59 发表 g=gf b x y = if b then x else y执行 g 会陷入无限循环。f True 1 g 得到 1。f False 1 g 无限循环。
原帖由 win_hate 于 2009-3-31 21:59 发表
g=g
f b x y = if b then x else y
执行 g 会陷入无限循环。
f True 1 g 得到 1。
f False 1 g 无限循环。
这段代码好面熟啊。
原帖由 flw 于 2009-3-31 22:01 发表 这段代码好面熟啊。
原帖由 flw 于 2009-3-31 22:01 发表
我以前没贴过啊?
改回来了,发现你回贴了,晚了一步呀
[ 本帖最后由 izhier 于 2009-3-31 22:05 编辑 ]
哦?我换成 2 `div` 0 之后确实是可以的。难道 Haskell 居然是 normal order 的?
复制代码
原帖由 izhier 于 2009-3-31 21:51 发表 Main> myIf False (2/0) 1ERROR - Cannot infer instance*** Instance : Fractional Int*** Expression : myIf False (2 / 0) 1这个提示是 Cannot infer,说明类型不匹配我想问一下: 0 是 Frac ...
原帖由 izhier 于 2009-3-31 21:51 发表
Main> myIf False (2/0) 1ERROR - Cannot infer instance*** Instance : Fractional Int*** Expression : myIf False (2 / 0) 1
这个提示是 Cannot infer,说明类型不匹配我想问一下: 0 是 Frac ...
类型不匹配是因为2/0类型为(Fractional t) => t,而你的myIf的类型声明中,该参数为Int。
你把2/0换为div 2 0就好了。
flw理解完全错误。你可以用myIf (1==2) undefined (2+3)来检验。
复制代码这个提示是 Cannot infer,说明类型不匹配,根本没有通过类型推导系统(2/0) 不是 Int 类型
复制代码[ 本帖最后由 izhier 于 2009-3-31 21:59 编辑 ]
解释完全错误!
你这个是 normal order 和 application order 的区别,和是不是 lazy 没太大关系。很遗憾,Haskell 是 application order 的,也就是说,是
你会认为:解释器先把 ("fst" == "Fst") 和 (2+3) 分别计算为 False 和 5,然后把 False、1 和 5 绑定到 myIf 函数的三个参数 cond、a 和 b上,因为 cond 为 False,所以返回 5.
这样子的。
你认识的正好是错误的。
你可以用 myIf (1==2) (2/0) (2+3) 来检验。
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
暂无简介
文章 0 评论 0
接受
发布评论
评论(9)
这段代码好面熟啊。
我以前没贴过啊?
改回来了,发现你回贴了,晚了一步呀
[ 本帖最后由 izhier 于 2009-3-31 22:05 编辑 ]
哦?
我换成 2 `div` 0 之后确实是可以的。
难道 Haskell 居然是 normal order 的?
复制代码
执行 g 会陷入无限循环。
f True 1 g 得到 1。
f False 1 g 无限循环。
类型不匹配是因为2/0类型为(Fractional t) => t,而你的myIf的类型声明中,该参数为Int。
你把2/0换为div 2 0就好了。
flw理解完全错误。你可以用myIf (1==2) undefined (2+3)来检验。
复制代码
这个提示是 Cannot infer,说明类型不匹配,根本没有通过类型推导系统
(2/0) 不是 Int 类型
复制代码
[ 本帖最后由 izhier 于 2009-3-31 21:59 编辑 ]
解释完全错误!
你这个是 normal order 和 application order 的区别,和是不是 lazy 没太大关系。
很遗憾,Haskell 是 application order 的,也就是说,
是
这样子的。
你认识的正好是错误的。
你可以用 myIf (1==2) (2/0) (2+3) 来检验。