免费注册 查看新帖 |

Chinaunix

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

最近入了本SICP,发现自己对Lisp没以前那么反感了……好像括号看起来还不错…… [复制链接]

论坛徽章:
5
狮子座
日期:2013-08-20 10:12:24午马
日期:2013-11-23 18:04:102015年辞旧岁徽章
日期:2015-03-03 16:54:152015亚冠之德黑兰石油
日期:2015-06-29 18:11:1115-16赛季CBA联赛之新疆
日期:2024-02-21 10:00:53
31 [报告]
发表于 2012-03-29 03:18 |显示全部楼层
回复 55# OwnWaterloo


    你的结论呢?我觉得稍微装装也不算啥,就事论事的话,他也有很牛的地方。对于共事来说,你的想法呢?

其实我觉得吧,他又不是做学问的,偶尔装装,也是可以理解的嘛= =比起老谭之流,至少还是好多了的。

论坛徽章:
5
狮子座
日期:2013-08-20 10:12:24午马
日期:2013-11-23 18:04:102015年辞旧岁徽章
日期:2015-03-03 16:54:152015亚冠之德黑兰石油
日期:2015-06-29 18:11:1115-16赛季CBA联赛之新疆
日期:2024-02-21 10:00:53
32 [报告]
发表于 2012-03-29 10:24 |显示全部楼层
回复 61# OwnWaterloo


    你真的确定这个写法能过编译????
  1. foldr' F id bs = \y -> foldl f y bs
  2.     where F = \b g x -> g $ f x b
复制代码
我这边不能上外网,麻烦给个正确的示例,我再想想~

论坛徽章:
5
狮子座
日期:2013-08-20 10:12:24午马
日期:2013-11-23 18:04:102015年辞旧岁徽章
日期:2015-03-03 16:54:152015亚冠之德黑兰石油
日期:2015-06-29 18:11:1115-16赛季CBA联赛之新疆
日期:2024-02-21 10:00:53
33 [报告]
发表于 2012-03-30 13:01 |显示全部楼层
回复 63# OwnWaterloo


    不能访问。SICP对面向对象(或者说ADT,或者说名字空间,或者说代码组织,或者说模块封装)有十分独特的看法,让人觉得耳目一新,我要不要发个贴讲解一下?

论坛徽章:
5
狮子座
日期:2013-08-20 10:12:24午马
日期:2013-11-23 18:04:102015年辞旧岁徽章
日期:2015-03-03 16:54:152015亚冠之德黑兰石油
日期:2015-06-29 18:11:1115-16赛季CBA联赛之新疆
日期:2024-02-21 10:00:53
34 [报告]
发表于 2012-03-30 13:56 |显示全部楼层
本帖最后由 starwing83 于 2012-03-30 13:58 编辑

回复 63# OwnWaterloo


    擦……回错了……重回

    关于foldr转foldl的我搞清楚了。这里说明一下。首先,我们有:

  1. foldr' f i [] = i
  2. foldr' f i (x:xs) = f x (foldr' f i xs)
复制代码
当定义foldl‘’的时候,我们有:

  1. foldl'' f i xs = foldr' (\b g x -> g (f x b)) id xs i
复制代码
首先我们知道,foldl的功能是对f和i,[x1, x2, ... , xn], 产生这样的计算过程:

  1. ( ... ((i `f` x1) `f` x2) ... ) `f` xn)
复制代码
而foldr是产生这么一个计算过程:

  1. (x1 `f` (x2 `f` ( ... ( xn `f` i)) ... )
复制代码
从foldr的定义中可以很清楚的看到这种转换。

现在我们看用foldr的那个定义是如何处理的。首先用`f`计算xn和i:

  1.     (\b g x -> g(f x b)) xn id
  2. --> (\     x -> id (x `f` xn))
  3. --> (\x -> x `f` xn)
复制代码
由此可知,我们将xn放到了右边,并延缓了计算(直到给出x为止)
然后我们以这个函数、给出的函数和xn-1计算新的值:

  1.   (\b g x -> g (f x b)) xn-1 (\x -> x `f` xn)
  2. --> (\ x -> (\x -> x `f` xn) (x `f` xn-1))
  3. --> (\x  -> ((x `f` xn-1) `f` xn))
复制代码
一样的过程,将xn-1插入到了xn之前,并延缓执行。

以此类推,最后的结果就是将计算按照foldl的方式安排好了,但是所有的计算都被延缓了。

最后,给出一个初始值i,启动整个计算,这个计算就是foldl的了。

问题是:
1. 展开的时候,有没有栈的问题?会不会有无穷展开导致编译错误的情况?
2. 这种延缓的执行启动的时候,是否是in-place执行的?就和foldl一样?
3. foldr本身是延缓执行的。它能不能通过参数调整的方式做到in-place执行?比如,先执行最后一个,然后逐次向前迭代,做到in-place?
4. 最后,Haskell有没有尾调用?Haskell的优化可以保证到什么程度?在逻辑上有迭代执行的可能性的时候,Haskell是不是一定可以迭代执行?

论坛徽章:
5
狮子座
日期:2013-08-20 10:12:24午马
日期:2013-11-23 18:04:102015年辞旧岁徽章
日期:2015-03-03 16:54:152015亚冠之德黑兰石油
日期:2015-06-29 18:11:1115-16赛季CBA联赛之新疆
日期:2024-02-21 10:00:53
35 [报告]
发表于 2012-03-30 15:21 |显示全部楼层
回复 67# pandaiam


    亚马逊搜一下把,直接搜sicp

论坛徽章:
5
狮子座
日期:2013-08-20 10:12:24午马
日期:2013-11-23 18:04:102015年辞旧岁徽章
日期:2015-03-03 16:54:152015亚冠之德黑兰石油
日期:2015-06-29 18:11:1115-16赛季CBA联赛之新疆
日期:2024-02-21 10:00:53
36 [报告]
发表于 2012-03-30 16:02 |显示全部楼层
回复 69# OwnWaterloo


    SCIP在没有引入赋值的基础上就导出了类型系统哦~(不是OO)

论坛徽章:
5
狮子座
日期:2013-08-20 10:12:24午马
日期:2013-11-23 18:04:102015年辞旧岁徽章
日期:2015-03-03 16:54:152015亚冠之德黑兰石油
日期:2015-06-29 18:11:1115-16赛季CBA联赛之新疆
日期:2024-02-21 10:00:53
37 [报告]
发表于 2012-03-30 16:04 |显示全部楼层
回复 70# OwnWaterloo


    31.5,贵么?

论坛徽章:
5
狮子座
日期:2013-08-20 10:12:24午马
日期:2013-11-23 18:04:102015年辞旧岁徽章
日期:2015-03-03 16:54:152015亚冠之德黑兰石油
日期:2015-06-29 18:11:1115-16赛季CBA联赛之新疆
日期:2024-02-21 10:00:53
38 [报告]
发表于 2012-03-30 16:48 |显示全部楼层
本帖最后由 starwing83 于 2012-03-31 11:45 编辑

回复 73# pandaiam
  1. local function dfs(t, idx)
  2.     if t.equals == t.result then error "ok" end

  3.     local idx = idx or 1
  4.     local cur = t[idx]
  5.     if cur == t.len then
  6.         t.equals = t.equals + 1
  7.         dfs(t, idx + 1)
  8.         t.equals = t.equals - 1
  9.         return
  10.     end

  11.     for i = #t, idx+1, -1 do
  12.         local res = cur + t[i]
  13.         if res <= t.len then
  14.             t[i] = res
  15.             dfs(t, idx + 1)
  16.             t[i] = t[i] - cur
  17.         end
  18.     end
  19. end

  20. local function solve(t)
  21.     -- find the posible length
  22.     table.sort(t)
  23.     t.max = t[#t]
  24.     t.sum = 0
  25.     for i, v in ipairs(t) do t.sum = t.sum + v end
  26.     for i = t.max, t.sum do
  27.         t.result = t.sum/i
  28.         if t.result == math.floor(t.result) then
  29.             t.equals = 0
  30.             t.len = i
  31.             if not pcall(dfs,t) then return i end
  32.         end
  33.     end
  34. end

  35. print(solve {5,2,1,5,2,1,5,2,1,6})
  36. print(solve {2,3,5,7,11,13,17,19,23})
  37. print(solve {1,2,3,4})


复制代码

论坛徽章:
5
狮子座
日期:2013-08-20 10:12:24午马
日期:2013-11-23 18:04:102015年辞旧岁徽章
日期:2015-03-03 16:54:152015亚冠之德黑兰石油
日期:2015-06-29 18:11:1115-16赛季CBA联赛之新疆
日期:2024-02-21 10:00:53
39 [报告]
发表于 2012-03-30 16:56 |显示全部楼层
回复 74# OwnWaterloo


    不大容易,因为要归纳还有点难度。

话说回来把。我觉得haskell和lisp一样都是一种毒品。一旦你习惯了list/curry,再去看C/C++,真是很痛苦的事情,你会觉得自己被限死在一套框子里面出不来的感觉。以前对机器的直觉感觉越来越模糊了。都快记不得CPU,RAM,寄存器,跳转,堆栈这些东西了,脑海中就只有变换,计算这些,感觉是两个世界的存在,一个是机械世界,一个是生物世界。

论坛徽章:
5
狮子座
日期:2013-08-20 10:12:24午马
日期:2013-11-23 18:04:102015年辞旧岁徽章
日期:2015-03-03 16:54:152015亚冠之德黑兰石油
日期:2015-06-29 18:11:1115-16赛季CBA联赛之新疆
日期:2024-02-21 10:00:53
40 [报告]
发表于 2012-03-30 17:18 |显示全部楼层
回复 78# OwnWaterloo


    不是说重要,也不是说好,但是,你不觉得那种直觉更真实么,特别是haskell,给我一种,恩,在念自己不懂原理的魔咒那种很没有安全感的感觉。我根本不知道编译器会在什么时候跟我抱怨,而C/C++我是知道的。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP