每年学一种新语言:今年是haskell
听从某本书的教诲(应该是code complete吧大概),每年应该学一门新语言以便开阔视野,即使是常年靠写c代码吃饭的,也可以把别家的优点吸收进c代码里得到好处。建议是不错,但实践起来太难了。
去年我学的是Python,囫囵吞枣的学了两天也没震撼到我的思维,感觉也就是类库比较多用着会顺手点吧,总之就是气场不合。我想要的效果是那种看完后大发感慨“原来还可以这么思维”,而不是“原来已经有现成库了”,那没意义。
然后今年就开始学haskell。也算是机缘巧合吧,其实我原计划是学erlang的,上dangdang网买erlang教程,订单下了两个月也没收到,一怒之下取消了转而去买real world haskell,因为有货(摊手)。买之前先简单的了解了下haskell的基本面貌,看到这个qsort代码:
qsort [] = []
qsort (x:xs) = qsort (filter (< x) xs) ++ [x] ++ qsort (filter (>= x) xs)
qsort (x:xs) = qsort (filter (< x) xs) ++ [x] ++ qsort (filter (>= x) xs)
居然看懂了!好简洁,而且和c语言的思维模型截然不同 基本就是把问题描述了一遍,结果就出来了。我想要的就是这个。
后来看到高阶函数和monad这一章的时候有点吃不消了 ,感觉完全没有fp的基础确实有点吃力,就又去买了sicp看。非常有意思的一本书,完全不枯燥,前三章难度不大迅速看完,看到4,5章的时候又有点吃不消了,理论基础太差,于是下lambda演算的论文看,看的死去活来,现在还在努力消化中。
感觉学haskell收获还是不小的,比去年看python好多了 ,但是要在一年内学完实在是太难了,我觉得今年能把lambda演算证明一遍,然后把sicp过一遍就算不错的了,更不用说深入理解haskell。难道每年一门新语言的意思只是说“了解”而不是“深入理解”?
最后贴一段自己写的求素数的haskell代码
1 filterlist::Integral a => [a]->[a]
2 filterlist (x:xs) = let filterfirst = [ a | a <- xs, a `mod` x /= 0] in
3 [x] ++ filterlist filterfirst
4 primes :: Int->[Int]
5 primes 0 = []
6 primes 1 = [2]
7 primes n = 2 : take (n-1) (filterlist [3, 5..])
2 filterlist (x:xs) = let filterfirst = [ a | a <- xs, a `mod` x /= 0] in
3 [x] ++ filterlist filterfirst
4 primes :: Int->[Int]
5 primes 0 = []
6 primes 1 = [2]
7 primes n = 2 : take (n-1) (filterlist [3, 5..])
把问题描述完了,这个问题也就解决了。