免费注册 查看新帖 |

Chinaunix

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

haskell 初学问疑 [复制链接]

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

不是太明白你说的语义是什么?

generator 不是只有在需要返回值时,才再次运行函数吗?
难道这没有 lazy 吗?
是不是我对 lazy 的概念有点不清呀?

慢慢来吧。别着急。时间长就好了。

论坛徽章:
0
12 [报告]
发表于 2009-03-27 11:06 |只看该作者
谢谢各位当家的
看来我还是没入门呀!

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

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
13 [报告]
发表于 2009-03-27 11:25 |只看该作者
每个语句,或者每个函数,都有它的语义。
语义搞懂这是个讨论的前提。

我前面已经说了,Haskell 的 lazy 体现在:
语义承诺了很多,不一定真的会去做那么多,实际上只要做到刚好就行了
这就叫惰性求值。

yield 的语义,就是立即停止本函数的运行,并且当前的调用栈打包到一个生成器对象中,并且 return 这个生成器对象
你可以清清楚楚地看到,yield 根本就没承诺会继续运行——除非你调用了 yield 所返回的生成器的 next 方法。
但调用 next 方法之后所导致的行为这又是 next 方法的语义了,它的语义和行为始终是是一致的。

论坛徽章:
0
14 [报告]
发表于 2009-03-27 12:09 |只看该作者
还有一个问题,也是关于递归的

haskell 对递归进行优化,从而程序员可以大量使用递归
而 imperative 语言中不提倡运用递归,因为递归会消耗大量的资源

为什么 imperative 语言不对递归进行像 haskell 那样的递归优化?

难道 imperative 语言优化递归
没有
functional 语言优化递归
方便,更容易实现?

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

论坛徽章:
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
15 [报告]
发表于 2009-03-27 12:11 |只看该作者
原帖由 izhier 于 2009-3-27 12:09 发表
为什么 imparetive 语言不对递归进行像 haskell 那样的递归优化?

这个依赖于编译器,有些有,有些没有。

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
16 [报告]
发表于 2009-03-27 12:13 |只看该作者
原帖由 izhier 于 2009-3-27 12:09 发表
还有一个问题,也是关于递归的

haskell 对递归进行优化,从而程序员可以大量使用递归
而 imperative 语言中不提倡运用递归,因为递归会消耗大量的资源

为什么 imperative 语言不对递归进行像 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
17 [报告]
发表于 2009-03-27 12:16 |只看该作者
原帖由 flw 于 2009-3-27 12:13 发表

不方便也许也是有的。毕竟有那么多的变量。

尾递归的优化倒和这个没有什么关系。

论坛徽章:
0
18 [报告]
发表于 2009-03-27 13:30 |只看该作者
我觉得即使在命令式语言中,如果递归能够清楚的表达你的代码的意思,用递归很好。
“命令式语言不提倡用递归”这个观念应该改改。
毕竟“代码是写给人看的,只是偶尔让机器执行一下”。
而且“代码应该表达程序的逻辑,性能应该交给编译器去关心”。

当你写的东西完成后,在发布之前需要进行性能调优。
此时,通过profiling找出程序的关键路径,如果有某个递归调用的函数在关键路径上,并且由于递归消耗了大量的时间,此时,才应该考虑将这个递归改写成循环。

原帖由 izhier 于 2009-3-27 12:09 发表
还有一个问题,也是关于递归的

haskell 对递归进行优化,从而程序员可以大量使用递归
而 imperative 语言中不提倡运用递归,因为递归会消耗大量的资源

为什么 imperative 语言不对递归进行像 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
19 [报告]
发表于 2009-03-27 14:19 |只看该作者
原帖由 freearth 于 2009-3-27 13:30 发表
我觉得即使在命令式语言中,如果递归能够清楚的表达你的代码的意思,用递归很好。
“命令式语言不提倡用递归”这个观念应该改改。

agreed. 不知道他是从什么地方听来的这个。
毕竟“代码是写给人看的,只是偶尔让机器执行一下”。

许多时候这个应该反过来说。

论坛徽章:
0
20 [报告]
发表于 2009-03-27 15:41 |只看该作者
又一个问题::wink:

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

  2. haskell 中 function 获取参数也是贪婪性的吧?
复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP