[Scala] 一次打十二個--透過 Future 和 For-Comprehensive 解決 Callback 地獄

話說這幾年用 Non-Blocking 的典範來寫程式很夯(例如 NodeJS 上幾乎都是 Non-Blocking),不過用 Non-Blocking 寫程式的時候,有時候程式碼會因為 Callback 的關係變得很雜亂,需要花一些時間來整理和維護,俗稱 Callback 地獄,後來大家也發展了不少的技巧來避免和減清這個問題。

不過這個問題在 Scala 上其實不太嚴重,主要因為 Scala 從函式編程引入的 Monad 的觀念和他的 for 迴圈的語法實在是太強大了……透過 Scala 標準函式庫內建 Future 類別和 for 迴圈,我們可以很輕鬆地把本來是 Blocking 的操作變成 Non-Blocking 操作,並且解決掉這類的 Callback 地獄問題。

口說為憑,我們直接來看一個例子好了。

話說台北市的開放資料網站上提供了行人垃圾筒的物件,但是卻是十二個行政區都是獨立的網址。如果今天我們想要取得台北市內所有的行人垃圾筒的資料並整合成一個單獨的 ...

[Scala] KeepRetry……爛掉了就一直重開

話說上個月換了工作,這次的工作主要是寫 Node.JS 的。說實話我之前對 Node.JS 是只有聽說過這東西,但因為我本身就偏好靜態型別的程式語言以及向來對 JavaScript 沒啥好感,加上相當喜歡而且用 Scala 也用的很順手了,所以對 Node.JS 並沒有特別研究,甚至在接這個工作之前連 Node.JS 的 HelloWorld 都沒寫過,只隱約知道一些它的特性和設計典範而已。

而只寫了這一個半月的 Node.JS,當然還是領悟不到什麼高深的技巧的,甚至還遇到了效能上的瓶頸而一知查不出原因,只好先和主管商良用不知道為什麼跑起來楞是快了十倍的 Scala 版本先擋著。

不過另一方面,這一個月也發現 Node.JS 下有一些常見的做法是我以前從未想過的,其中一個就是關於網頁程式和 HTTP Server 之間的關係。在以前由於都是寫些 PHP / JSP 之類的東西,所以在我的印象裡,HTTP Server ...

[Scala] 用 Scala 解很難死第三集裡的倒水問題。

前兩天總算把 Functional Programming Principles in Scala 最後一週的課程影片看完了,倒數第二個影片是利用 Functional Programming 的方式來解經典的倒水問題,影片裡解釋的很清楚,不過為了加深印象,所以用自己的理解方式幫程式碼加上一些註解。

/**
 *  用 Scala 解很難死第三集裡的倒水問題!
 *
 *  程式碼是從 Functional Programming Principles in Scala 出來的,加上一些註解
 *  方便理解,免得自己忘記。XD
 *
 *  原始問題:
 *
 *    現在有一個5加倫的水桶和3加倫的水桶,一個水池可以讓你填滿水桶或倒空水桶,
 *    要如何才能量出4加倫的水來阻止炸彈?
 *
 *  擴充版:
 *
 *    現在有N個水桶,一個水池可以讓你填滿或倒空水桶,你如何透過一連串的行動在
 *    某個水桶中裝剛剛好的水量X?
 *
 *  程式演算法核心:
 *
 *    暴力法 BFS Search,假設今天有5加倫和3加倫的水桶,我們有以下六個動作可以選擇:
 *
 *      - 清空5加倫的水桶
 *      - 清空3加倫的水桶
 *      - 裝滿5加倫的水桶
 *      - 裝滿3加倫的水桶
 *      - 把5加倫的水桶裡的水倒到3加倫的水桶
 *      - 把3加倫的水桶裡的水倒到5加倫的水桶
 *
 *    列出第 ...

[Scala] Function 與 Function 間的子類別關係。

前言

說真的,雖然高中的時候接觸過一點 C / Pascal,大學的時候正式接觸 C / Java 來寫程式,但還是一直到開始玩 Scala 之後,才知道原來一個函式可以是另一個函式的子類別。

只是就算有了這個粗淺的概念,也大致上知道什麼是 covariant / contravariant / invariant,但其實對於這個函式與函式之前的子類別關係一直都是一知半解的,一直到這個月上了 Coursera 網站上的 Functional Programming Principles in Scala 後,才終於搞懂函式與函式之間的子類別是什麼意思。

所以趁著腦袋還沒變鈍之前,來寫一篇筆記,記錄我理解這個問題的方式,方便以後查看復習。 XDD

普通物件的繼承關係與 Polymorphism

如果用過 C++ / Java 等物件導向的程式語言,那麼對於普通物件的繼承關係應該會很熟悉,大部書上最常舉的例子會像下面這樣:

class Animal {
  def eat() = println("I'm eating ...

[投影片] 我如何停止憂慮並愛上 Non-MVC Web Framework

今天在 OSDC.tw 2013 上給了一個 Talk,講的題目是「我如停止憂慮並愛上 Non-MVC Web Framework」,主要的內容是在介紹 Lift 的模版系統。

由於 Lift 採用了 Functional Programming 的角度來看待模版這件事,所以他的模版是單純的 xHTML / HTML5 檔案,裡面不能有任何的程式碼,而今天就是介紹 Lift 是怎麼樣在模版裡面不能有程式碼的情況下,將動態的內容注入模版中。

上面是今天的投影片,雖然是高橋流的方式,不過因為都有完整的程式碼,所以有興趣的話,還是可以參考一下。