Archive for 三月, 2009

收到了鸢弟的信 ^_^

Posted on 三月 31st, 2009 in 杂碎 | 5 Comments »

貌似是3月12日, 鸢弟突然的心血来潮, 然后今天ssword同学在今天突然收到了来自湖南的信件. 外加一精美书签和婴儿专用驱蚊剂.

电话和网络已经杀死了电报, 但最原始的信件依然活在这个世界上, 或许正是因为它的慢吧, 呵呵. 手写的字远比一堆unicode字符要真切的多, 撕开信封的感觉绝对比开gmail好, 真的.

ps:谁要ssword同学的手写信件? ^_^

and和or

Posted on 三月 24th, 2009 in 备忘 | 8 Comments »

在elephas同学的blog那里看到lua的一条小trick, 可以替代C中的(a==1) ? “one” : “not one” , 而且貌似还更符合英语的语法.

a=1
b=(a==1) and "one" or "not one"
print(b)

试了一下, 发现在ruby和python也同样可以使用这种写法. 解释器/编译器貌似是出于优化的目的, 在处理and运算符时, 如果and左端的逻辑表达式如果为假, 解释器就可以直接得到整个and为假, 而不用执行会右边的表达式. 与之相似, 在处理or运算符的时候, 若左端的表达式为真, 解释器就直接返回真而不会执行右边的表达式.

这听起来像是无聊的语法把戏罢了, 不过在php中, 你可能会经常遇到像这样的代码:

mysql_connect($dbname,$dbuser,$dbpass) or die("dbconnect error!");

呵, 有点ruby里面的rescue语句的样子, 实际上这就是一套朴素的错误处理了. mysql_connect函数如果成功, 就会return 1; 如果出错, 就return 0; 将mysql_connect放在if里是完全可以的, 但我觉得在后面跟个or可能更好看些. 现在的php貌似已经有了一套标准的错误处理机制, 不过php的代码又何时有过标准呢? :)

update: 在编译原理里貌似有提到这东西,标准的名字是“短路表达式”

haskell的排列组合

Posted on 三月 19th, 2009 in 备忘 | 2 Comments »

从chinaunix的fp板上看到的, 摘过来
原载自 http://bbs2.chinaunix.net/thread-1289053-1-2.html
作者为drunkedcat和MMMIX

组合:

combination :: [a] -> [[a]]
combination [] =  [[]]
combination (x:xs) =  (map (x:) (combination xs) )++ (combination xs)

排列:

permutation :: Eq a => [a] -> [[a]]
permutation [] = [[]]
permutation xs = concatMap (\x -> map (x:) $ permutation (delete x xs)) xs

笔记, lambda演算和组合子

Posted on 三月 19th, 2009 in 笔记 | No Comments »

看了几天wikipedia, 记一点自己的理解. 当然, 理解能力有限, 不一定正确.

还是关于lambda演算, 貌似church发明这东西是为了解决可计算性问题的判定, 也就是那个传说中的church-图灵论题. 同为形式系统(什么是形式系统…囧), 人们都说这东西跟图灵机的运算能力等价, 我觉得这种等价关系应该是在数学上, 而且是忽略中间的演算步骤的, 如1+1与1+34-78+96-51貌似就可以算是等价的.

lambda演算貌似有三个性质, 即alpha替换, beta规约, eta替换, 在函数式语言编译器的优化中貌似有很多用处, 具体就不了解了. 那帮数学家大胡子貌似专好用希腊字母吓唬人, 数学里貌似从来就没有过命名规范! … alpha替换貌似用来表示一个lambda表达式的等价关系, 如 λx.x+1与λy.y+1就是等价关系, 把x换成y, 依然还是那个lambda表达式; beta规约貌似易理解些, 拿程序做类比的话貌似就是函数调用了, 如((λ.x.λy.x+y) 2)就可以规约成λy.2+y, 即把函数的参数替换成另一个表达式, 去掉一阶lambda; eta替换貌似也是用来表示lambda表达式的等价关系, 如果 λx.f(x)==λx.g(x), 那么f==g.

一个lambda就是一个只有一个参数的函数, 要多个参数的函数就套多个阶的lambda, 像这样 λa.λb.a+b . 在(λb.a+b)中, a貌似就是自由变量, 不受这个lambda的约束. 由于(λb.a+b)这个函数中含有自由变量a, 所以这个函数只能在提供a这一自由变量的函数中存在而不能被自由传递或者调用. 而haskell curry大人发明的所谓组合子, 貌似就是没有自由变量的函数, 由于没有自由变量, 函数的自由传递就有了保证. 靠, map, filter, foldr, fst …. 你们全家都是组合子! 用有限数量的组合子就可以表示出特定范畴的所有运算, 也就是组合子语言, 传说中有个SK组合子语言, 只用S和K两个组合子就图灵完备了. map reduce filter貌似也可也看作是一门组合子语言, 单靠它们貌似就可以完成几乎所有的list操作. 呃, 还有那个一直以来让我闻之色变的monad, 貌似也是个组合子语言, 它里面只有>>=和return两个组合子…

貌似不需要把它们看得太复杂吧…概念都很简单…就像在学的高数和线代, 知道里面就那点东西, 可就是一个题都不会做…囧