免费注册 查看新帖 |

Chinaunix

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

haskell 初学问疑 [复制链接]

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
21 [报告]
发表于 2009-03-27 15:56 |只看该作者
原帖由 izhier 于 2009-3-27 15:41 发表
又一个问题::wink:

haskell 中运算符是贪婪性匹配的

haskell 中 function 获取参数也是贪婪性的吧?

应该说,apply(空格)的优先级最高才对。

论坛徽章:
0
22 [报告]
发表于 2009-03-27 17:44 |只看该作者
又来了

  1. Hugs.Base> :t sqrt
  2. sqrt :: Floating a => a -> a
  3. Hugs.Base> (sqrt 2)::Float
  4. 1.414214
  5. Hugs.Base> sqrt (2::Float)
  6. 1.414214
  7. Hugs.Base> sqrt 2::Float
  8. 1.414214
复制代码

以上优先级怎么判断呀?

论坛徽章:
0
23 [报告]
发表于 2009-03-27 17:47 |只看该作者
原帖由 izhier 于 2009-3-27 17:44 发表
又来了

Hugs.Base> :t sqrt
sqrt :: Floating a => a -> a
Hugs.Base> (sqrt 2)::Float
1.414214
Hugs.Base> sqrt (2::Float)
1.414214
Hugs.Base> sqrt 2::Float
1.414214

以上优先级怎 ...

我搞不清优先级的地方,就用括号……

论坛徽章:
0
24 [报告]
发表于 2009-03-27 17:54 |只看该作者

回复 #23 Magicloud 的帖子


但如果不清楚,始终是一个疑问

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
25 [报告]
发表于 2009-03-27 18:02 |只看该作者
原帖由 izhier 于 2009-3-27 17:44 发表
又来了

Hugs.Base> :t sqrt
sqrt :: Floating a => a -> a
Hugs.Base> (sqrt 2)::Float
1.414214
Hugs.Base> sqrt (2::Float)
1.414214
Hugs.Base> sqrt 2::Float
1.414214

以上优先级怎 ...

1 和 3 是相同的。
2 和它们两个不同。

由于字面值 2 实际上被定义成了 Num 类的任何一个实例的类型,
而 Float 是 Num 类的实例,因此 2 是可以转化成 Float 类型的。
在 1 3 两个情形中,
由于 sqrt 2 的结果被描绘成了 Float,因此由它的原型 a -> a 可以推导出它的参数必然也是 Float,
而 2 正好也满足了这个条件,因此类型匹配,计算得以继续,得到了 2 的平方根。
在第 2 个情形中,
由于 sqrt 的参数被描绘成了 Float 型,因此 sqrt 2 的结果自然也是 Float 型。

其实用 show (2::Int) 就可以很容易看到 :: 和 apply 的词法优先级谁高谁低。

论坛徽章:
0
26 [报告]
发表于 2009-03-27 18:07 |只看该作者
原来如此!

再问一下:

  1. Hugs.Base> sqrt 2::Float
  2. 1.414214
  3. Hugs.Base> sqrt 2
  4. 1.4142135623731
复制代码

以上两个表达式的为什么不同 ?
难道类型不一样 ?

  1. Hugs.Base> :t (sqrt 2)
  2. sqrt 2 :: Floating a => a
  3. Hugs.Base> :t (sqrt 2::Float)
  4. sqrt 2 :: Float
复制代码

Floating,Float 有什么区别呢?

[ 本帖最后由 izhier 于 2009-3-27 18:20 编辑 ]

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
27 [报告]
发表于 2009-03-27 18:34 |只看该作者
原帖由 izhier 于 2009-3-27 18:07 发表
原来如此!

再问一下:

Hugs.Base> sqrt 2::Float
1.414214
Hugs.Base> sqrt 2
1.4142135623731

以上两个表达式的为什么不同 ?
难道类型不一样 ?

Hugs.Base> :t (sqrt 2)
sqrt 2 :: Floating  ...

Floating 是类 class
Float 是类型 type

Float 是 Floating 的实例,
由于 sqrt 的类型是 Floating a => a -> a,所以实际上是可以匹配 Float -> Float 的。

由 :i Floating 可以看到,Floating 还有一个实例叫做 Double。
估计 sqrt 2 是按照 sqrt 2::Double 来处理了。这个就是编译器的缺省规则了,注意观察并且记住即可。

[ 本帖最后由 flw 于 2009-3-27 18:42 编辑 ]

论坛徽章:
0
28 [报告]
发表于 2009-03-27 19:50 |只看该作者
谢谢 flw !


今天刚看到 programming in haskell 第四章
其中4.4节有说:

  1. function application has higher priority than all other operators.
复制代码

[ 本帖最后由 izhier 于 2009-3-28 11:32 编辑 ]
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP