2012-04-12

Haskell 與超人 [上]

人類是一條繫在動物與超人之間的繩索,一條高懸於深淵的繩索,要從一端越過另一端是危險的。  ——尼采
這篇文章的內容會有點凌亂,甚至應該屬於另一個 Blog 的範圍。不過真正讓我開始下筆書寫的觸發點,卻是 Haskell 與這幾年寫程式的有感而發,那也就放在這邊了。

先說標題的「超人」。雖然開頭引用了尼采的超人說,不過我沒打算(也沒能力)使用尼采的「超人」定義,而是普羅大眾習慣的「superman」,或著用「天才」可能更適切一點。但是用 superman 來誤解尼采的這番話,其實另有一番味道在......

我覺得這幾年的程式語言發展逐漸有「超人化」的現象。

前幾天為了應徵一份工作,沒想到考題上除了 Ruby、Python 之外,居然還來了個 Haskell?這 funtional language 久聞其名,但始終不敢、也不想碰。只是題目(工作)既然來了,就只好硬著頭皮上,於是零零總總花了十幾個小時,寫出這樣子的玩意:
powerset l = makePowerset (bitLength l) l

makePowerset 0 l = [makeElement 0 l]
makePowerset v l = (makePowerset (pred v) l) ++ [(makeElement v l)]

makeElement v [] = []
makeElement v l =
       if v `mod` 2 == 1
       then (take 1 l) ++ (makeElement (v `quot` 2) (tail l))
       else (makeElement (v `quot` 2) (tail l))

bitLength x = 2^(length x)-1
後來 godfat 有用比較符合 Haskell 的方式改寫一份,這裡就先跳過了。順便 murmur 一下:只要問一下 Google ,我連環境都不用安裝,就能直接給經典答案了。老闆驚訝為甚麼要搞這麼久的同時,有沒有想想其他可能?還是說我看起來笨到不會 Google...... Orz 。這年頭要老老實實遵循本質好好作點事情真的好難。(是的,我沒被錄用... lol)

在這十幾個小時的摸索當中,很自然地會拿寫 Java 的經驗與心得去對應 Haskell(以及 Ruby / Python)。Haskell 很神奇、有很多很妙的功能(例如 list comprehension, lazy)。在看 Haskell 的教學文件時,我彷彿回到 n 年前那些完全聽不懂的數論課,也許受過標準數學系訓練的人會比較喜歡 Haskelll 而不是傳統的程式語言。

問題是,我念數學系的結果是二一退學...... lol

對我、或是對於 Computer Scienc 來說,為甚麼要出現 Haskell(或是 Ruby/Python),而不是乾脆底層 ASM、上層 Java 兩個一統天下就算了?又或著,為甚麼新出來的語言不是朝「更容易撰寫」的方向前進,反而是讓人覺得更難寫、更難懂?

(如果反對「Java 比 Ruby/Python 難寫難懂」,可以只看 Java 跟 Haskell 就好。)

這一切又回歸到一個很離題的問題:「我們認知的美感,是與生俱來的?還是被教導出來的?」

就像 Manet 的《Olympia》:

直覺地看,這幅畫就是(很貴的)裸女畫,或許跟荒木經惟許多作品比起來是樂勝,可絕對沒有壹週刊拍的好看。但是如果探究 Manet 其人其事其時空背景、上溯至《Venere di Urbino》,這個畫作可能就有許多的「意思」。(但是我還參不透「了解這些意思」跟「美感」之間的關係)

也許《城邦暴力團》比較好解釋這一切,書本裡隱射著一堆書本外的歷史與人物,字行間又玩起一堆文學與文學間的啞謎,這「小山重疊誰不語/相思今夜雙飛去/鵲起恨無邊」可以是閨怨、也可以是岳子鵬。如果不先有那些底子,則無法玩味這些哏,就像沒看過《Star War》的人聽到「I am your father」可能完全無所感,即使讓他去問香蕉也一樣。

朋友周老丸曾經跟我抱怨:「你說很棒的《讓子彈飛》到底哪裡好看?」「因為裡頭有滿滿的哏。」「可是你不覺得太滿、步調太快,整個讓人覺得很疲累?」「這就是樂趣來源啊 [握拳]」

也許跳的太遠了,不如回頭看待符號、syntax sugar 這類東西。

(待續)