嵐達網是一個為程式語言同好設置的中文社群網站。程式語言學原本即是計算科學之中有悠久傳統的重要類別。近年來,面對諸如並行處理等日益複雜的程式設計挑戰,不論學界或業界都再度對程式語言學感到興趣。

More

Haskell

Haskell 的事件處理與 Elerea 函式庫

假想今天我們要用 Haskell 寫一個 GUI 遊戲。遊戲的地圖上可能會有若干怪物,還有一個玩家,在地圖上的怪物出現在場上的時間不是一個固定的值(有可能是玩家消滅該怪物,或者是根據腳本可能會暫時消失),我們該如何維護地圖呢?

上述的遊戲其實就是 Patai Gergely 所撰寫的 Dungeons of Wor。他在寫 Dungeons of Wor 的時候發現他沒有一個好用的 Functional React Programming (FRP) 函式庫可以用,所以他自己寫了一個 Elerea 函式庫。Elerea 函式庫的主要目的就是要讓我們把 Signal 加入 SignalGen,再使用 replicateM 讓 Monad 執行若干次轉換,如果該次轉換滿足 Signal 的 delay,該 Signal 就會被列出來。

如果對與 Elerea 的設計與作者的想法有興趣的人可以參閱:Nothing Personal: Behind the Dungeons

--
消息來源:SCM 老師的 email。

GHC's new LLVM codegen

Smoking fast Haskell code using GHC’s new LLVM codegen

不知道未來 GHC backend 會不會都換成 LLVM 呢?
LHC 又如何?另一方面,David Himmelstrup 有一篇講為什麼 LHC 不用 LLVM,
與 LLVM 為什麼不能取代 C--. 提到了一些關於 garbage collection 的問題...
Why LLVM probably won't replace C--.

由於沒有看得很懂,就不多做評論了 @@

從函數編程看計算語意學

Jan van Eijck 與 Christina Unger 籌備中的新書 Computational Semantics with Functional Programming (將由 Cambridge University Press 出版) 手稿及相關補充資料(Haskell 程式、習題解答等)已全文上網。該書主題為計算語言學 --- 以計算觀點看自然語言的語意,但使用 Haskell 當作研究、實驗的工具。目錄:

  1. Formal Study of Natural Language
  2. Lambda Calculus, Types, and Functional Programming
  3. Functional Programming with Haskell
  4. Formal Syntax for Fragments
  5. Formal Semantics for Fragments
  6. Model Checking with Predicate Logic
  7. The Composition of Meaning in Natural Language
  8. Extension and Intension
  9. Parsing
  10. Handling Relations and Scoping
  11. Continuation Passing Style Semantics
  12. Discourse Representation and Context
  13. Communication as Informative Action

英國中土基礎計算科學研習營

英國又有一個不錯的春季課程: Midlands Graduate School in the Foundations of Computing Science,為期一週、設計上是為博士班學生開設的密集課程,但也歡迎學者和有興趣的人士參加。

日期: 2010 年三月 28 日至四月一日。

課程:

神祕的階層...?

這是前一陣子出現在 Haskell mailing list 上的問題。大家都知道這是階層函數的定義:

fact :: Integer -> Integer
fact 1 = 1
fact n = n * fact (n - 1)

為什麼下面這個函數 fact2 碰到大的輸入時比 fact 快呢?

fact2 :: Integer -> Integer
fact2 x = f x y
  where
   f n e | n < 2 = 1
         | e == 0 = n * (n - 1)
         | e > 0 = (f n (e `div` 2)) * (f (n - (e * 2)) (e `div` 2))
                        y = 2 ^ (truncate (log (fromInteger x) / log 2))

Multicore Programming in Haskell Now!

Galois 的 Don Stewart 在 DEFUN 2009 中給了這場精彩的演講: Multicore Programming in Haskell Now! 裡頭逐項介紹了 Haskell 從 90 年代到最近引進的幾種平行/並行程式設計機制:

  1. par, pseq做平行處理:
  2. MVar 達成的 concurrent programming;
  3. 最近的熱門話題: Software Transaction Memory;
  4. 和剛出爐的 data parallel programming.

ICFP 2009 演講全程錄影上網

ICFP 2009 (第 14 屆 ACM SIGPLAN 函數編程國際會議) 和部份周邊研討會,包括 Erlang Workshop, CUFP (函數編程之商業用途), Haskell Symposium, Haskell Implementer’s Workshop 等等的全程錄影已經上網了。據我所知這是 ICFP 第一次嘗試將演講錄影上網,希望以後也能一直這麼做下去。大家可由其官網連結中找到議程,影片則在 Malcolm Wallace 設置的 vimeo 相簿中。

幾天的會議中有很多精彩的演講。三場邀請演講分別由 Guy Steele映射摺疊與平行處理Benjamin Pierce用 Coq 教程式語言Dan Piponi單子、量子計算、與繩結(是的,他和做駭客任特效務拿奧斯卡獎的 Dan Piponi 是同一個人),都應有不同的聽眾會喜歡。覺得和技術論文有距離的人則可以看看 Peter Landin 紀念Rod Burstall 得到 SIGPLAN 程式語言成就獎99 年最有影響力論文獎等等感人場面,或著總是很好玩的 ICFP 程式設計比賽頒獎。猜猜今年哪個語言得獎?

技術論文方面,有趣的演講很多,大概要興趣相合才能理解了。若找到喜歡的題目,一場技術演講連問題只有 25 分鐘,算是很快的吸收資訊的方法(對講者而言要把演講濃縮成這樣就很辛苦了)。這邊只提一個: Ralf Hinze 的 La Tour D’Hanoï 講河內塔問題:

A Prolog In Haskell

真正的埃氏篩法

埃氏篩法(Sieve of Eratosthenes)是一個尋找質數的演算法。長久以來,下面的這個「埃氏篩法」程式已經被當作示範 lazy evaluation 可以讓程式多麼簡潔漂亮的標準範例:

primes = sieve [2..]
sieve (p : xs) = p : sieve [x | x <- xs, x `mod` p > 0]

不過,Melissa E. O’Neill 最近的論文 The Genuine Sieve of Eratosthenes 卻指出這並不是埃氏篩法!由於剔除非質數的方式不同,上面的程式效率遠比真正的埃氏篩法來得低。

是否能在兼顧程式簡潔度的情況下正確地實作埃氏篩法,並仍然產生無限長的質數串列呢?O’Neill 認為應該使用不同的資料結構,並且指出 functional programmer 對使用串列以外的資料結構也許抱著太保守的態度。有趣的是,O’Neill 和 Richard Bird 通信後,Bird 也提出了使用 lazy 串列的另一個演算法,使得本文讀來更有意思。

如何寫 lazy 程式

Henning Thielemann 寫了一篇教學,關於如何寫 lazy 程式:

One of Haskell's main features is non-strict semantics, which is implemented by lazy evaluation in all popular Haskell compilers. However many Haskell libraries found on Hackage are implemented as if Haskell were a strict language. This leads to unnecessary inefficiencies, memory leaks and, we suspect, unintended semantics. In this article we want to go through some techniques on how to check lazy behaviour on functions, examples of typical constructs which break laziness without need, and finally we want to link to techniques that may yield the same effect without laziness.

Syndicate content