免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 37850 | 回复: 3
打印 上一主题 下一主题

函数式语言的不动点技巧应该什么时候以什么方式使用为好? [复制链接]

论坛徽章:
8
2015年迎新春徽章
日期:2015-03-04 09:58:112015元宵节徽章
日期:2015-03-06 15:51:33数据库技术版块每日发帖之星
日期:2016-06-09 06:20:00数据库技术版块每日发帖之星
日期:2016-06-10 06:20:00数据库技术版块每日发帖之星
日期:2016-07-20 06:20:0015-16赛季CBA联赛之同曦
日期:2016-07-21 21:26:51数据库技术版块每日发帖之星
日期:2016-07-23 06:20:00数据库技术版块每日发帖之星
日期:2016-07-26 06:20:00
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2016-07-24 10:04 |只看该作者 |倒序浏览
函数式语言的不动点技巧应该什么时候以什么方式使用为好?

论坛徽章:
2
青铜圣斗士
日期:2015-11-26 06:15:59数据库技术版块每日发帖之星
日期:2016-07-24 06:20:00
2 [报告]
发表于 2016-07-26 01:21 |只看该作者
例如: That About Wraps it Up: Using FIX to Handle Errors Without Exceptions, and Other Programming Tricks

大概是讲这么个事情。。。
1. 把需要递归的函数f写成非递归的形式f'
2. 用fix把非递归的f'再转换成与原始f类似的函数

然而在1到2之间, 可以插入很多步骤, 将f'进行各种转换, 最终在2里面用fix把它再转换成与原始f类似, 但有一些新功能的函数。

  1. fun fact i = if i = 0 then 1 else i * fact (i-1) ;
复制代码
这是个求阶乘的函数, 它的函数体直接调用自己。
于是一旦开始调用这个函数, 它就会一直重复不断地调用自己, 直到i为0。

1. 现在先将它写成非递归形式:

  1. val fact_ = fn fact => fn i => if i = 0 then 1 else i * fact (i-1) ;
复制代码
fact_ 没有直接调用自己, 它调用的只是自己的一个参数。

2. "FIX fact_" 就得到一个与fact类似的函数。


将 fact 写成 fact_ 后, 因为不再直接调用自己, 所以就可以在每一个调用上作一些事情。

比如打印出中间结果:

  1. val wrap = fn f => fn f’ => fn p =>
  2.   let
  3.     val result = f f’ p
  4.   in
  5.     print (Int.toString result); print "\n"; result
  6.   end ;
  7. val fact_’ = wrap fact_ ;
  8. val fact’ = FIX fact_’ ;
  9. > fact’ 10;
  10. 1 1 2 6
  11. 24
  12. 120
  13. 720
  14. 5040
  15. 40320
  16. 362880
  17. 3628800
  18. val it : int = 3628800
复制代码
论文里面还有很多类似的应用, 比如记忆化, 比如将produce/consume拆开让它们交替执行, 等等。。。

论坛徽章:
8
2015年迎新春徽章
日期:2015-03-04 09:58:112015元宵节徽章
日期:2015-03-06 15:51:33数据库技术版块每日发帖之星
日期:2016-06-09 06:20:00数据库技术版块每日发帖之星
日期:2016-06-10 06:20:00数据库技术版块每日发帖之星
日期:2016-07-20 06:20:0015-16赛季CBA联赛之同曦
日期:2016-07-21 21:26:51数据库技术版块每日发帖之星
日期:2016-07-23 06:20:00数据库技术版块每日发帖之星
日期:2016-07-26 06:20:00
3 [报告]
发表于 2016-07-27 18:45 |只看该作者
=>是什么意思?

论坛徽章:
8
2015年迎新春徽章
日期:2015-03-04 09:58:112015元宵节徽章
日期:2015-03-06 15:51:33数据库技术版块每日发帖之星
日期:2016-06-09 06:20:00数据库技术版块每日发帖之星
日期:2016-06-10 06:20:00数据库技术版块每日发帖之星
日期:2016-07-20 06:20:0015-16赛季CBA联赛之同曦
日期:2016-07-21 21:26:51数据库技术版块每日发帖之星
日期:2016-07-23 06:20:00数据库技术版块每日发帖之星
日期:2016-07-26 06:20:00
4 [报告]
发表于 2016-08-22 07:38 |只看该作者
wrap函数是干什么的?
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP