7

我正在觀看約翰休斯的採訪,他被問到當他從哈斯克爾轉到厄蘭時他是否錯過了懶惰。作爲回答,他說是的,他用工具「模仿」它。 我的問題是:如何用嚴格的語言模仿懶惰?在主流語言中看到很酷的例子會很高興。如何模仿懶惰

回答

7

通常的訣竅是使用lambda(我想那將是Erlang的fun)。

下面是一個使用Ruby的一個例子:

Monad equivalent in Ruby

的基本想法是很簡單...你你想偷懶,把它包在一個零參數匿名函數,那麼無論表達取當你想強迫它時評估這個功能。

1

你可能想看看python生成器的細節。

總之,這些對象有一個__next__消息,它允許他們產生一個項目。因此,它們可以組成,以便每個步驟的處理都可以從下一個組合的發生器中抽取一個項目。

這樣,python程序員可以輕鬆地使用無限序列(或長度爲1的序列)。

2

如果您只想模擬非嚴格性,那麼您只需將表達式包裝到函數中並在需要時調用它。

如果你真的想模仿懶惰(即對記憶不嚴格),那麼你需要將該函數包裝成可變引用。素描OCaml中(忽略例外):

type 'a lazy = 'a thunk ref 
and 'a thunk = Lazy of unit -> 'a | Memo of 'a 

let lazy f = ref (Lazy f) 
let force l = match !l with 
    | Lazy f -> let x = f() in l := Memo x; x 
    | Memo x -> x 

除OCaml中已經有這個預定義在其圖書館(在某種程度上,也負責處理根據f例外)。