當我在Haskell中寫入類似map (1+) list
的東西時,(1+)
的內部表示是什麼?由於它是(+)
的部分應用,所以參數1
必須保存在某個地方,但我無法理解這一點。有人可以給我一個簡單的解釋,如何實施咖啡和部分應用?部分應用程序在運行時如何表示?
回答
您可能還想看看Implementing Functional Languages: A Tutorial,一本由Simon Peyton Jones和David Lester編寫的書。
我在哪裏可以得到它? – fuz 2011-04-04 17:10:37
不知道。幾年前我從當地的大學圖書館借了它,但我不認爲這是一種選擇。 無論如何,如果你能掌握它,我強烈建議你這樣做。這是一個非常輕量級的文本,也是功能語言實現的非常好的介紹。 – 2011-04-04 17:16:05
現在看起來有一個在線版本,該書已絕版:http://research.microsoft.com/en-us/um/people/simonpj/Papers/pj-lester-book/ – 2011-04-04 17:18:17
想想這樣:所有的東西都是由一段代碼(一個「thunk」)表示的,必須直接調用才能得到結果。當你編寫一個文字1
時,它會被編譯成一個調用時返回1的代碼塊(實際上是fromIntegral 1
),然後代碼塊被用來代替文字1.這也是懶惰的關鍵:代替立即計算某個東西,創建一個thunk,在調用時將執行計算。如果將該表達式傳遞給另一個函數,那麼它就是傳遞的包裝器thunk,所以直到/除非需要明確檢查其結果,否則計算不會發生。
在Haskell中,函數應用程序以相同的方式表示:一個thunk處理一個參數並返回一個thunk,該thunk處理下一個參數或產生結果。所以(1+)
是功能應用程序(+) 1
:(+)
是一個thunk,希望傳遞一個單一的數字並返回一個thunk,期望通過另一個單一的數字。由於(+)
是嚴格的,那第二個thunk實際上做了加法,而不是返回一個必須被調用來執行實際加法的thunk。因此(1+)
評估爲第二個thunk,需要用map
提供的另一個數字調用,因爲它在list
上迭代。
部分應用函數(實際上幾乎所有Haskell堆中的其他東西)都被表示爲閉包 - 一個結合了代碼指針和參數槽的結構。具體而言,我們將未完全評估的值稱爲thunks。
在boxed data上查看此早期問題,並在how thunks are represented上查看GHC手冊。
啓發。謝謝! – fuz 2011-04-04 12:48:33
- 1. 如何在應用程序不顯示時運行應用程序?
- 2. 如何在運行應用程序時加載外部DLL?
- 3. 如何在應用程序未運行時顯示警報?
- 4. 如何部署Pyside應用程序? (運行時要求?)
- 5. 在webforms應用程序下單獨運行MVC應用程序的一部分
- 6. 如何從運行應用程序在Tomcat上部署Web應用程序
- 7. 如何顯示應用程序未運行時的通知
- 8. 應用程序在運行時不顯示任何東西
- 9. Rails應用程序在本地運行,部分在Heroku部署後部分運行
- 10. 如何在程序運行時顯示列表框或文本
- 11. 顯示標籤中部分程序的運行時間
- 12. 運行GUI應用程序作爲BuildMaster部署的一部分
- 13. 運行程序時的Android應用程序運行時錯誤
- 14. 應用程序僅在部分屏幕上運行?
- 15. eclipse如何運行時,它運行一個web應用程序
- 16. 如何在應用程序運行時執行活動?
- 17. 如何在Android應用程序運行時切換Android應用程序主題
- 18. 如何在應用程序運行時啓動進程?
- 19. 如何在ipad模擬器上部署/運行應用程序?
- 20. 如何在tomcat中部署和運行javafx應用程序
- 21. 如何在Flex應用程序中運行外部SWF?
- 22. 如何告訴部分Rails應用程序在www.mydomain.com/blog下運行
- 23. 運行應用程序時,ClickOnce部署的應用程序在更新過程中如何工作?
- 24. 如何在組織內部進行應用程序分發(內部應用程序分發)?
- 25. IllegalStateException在運行JavaCV應用程序時
- 26. 應用程序設置 - 在運行時
- 27. 在啓動時運行應用程序
- 28. 在運行時轉換應用程序
- 29. 在啓動時運行應用程序
- 30. 時間應用程序在運行
您是否瞭解關閉(如何實現lambda函數)? '(1+)'只是說'(\ x - > 1 + x)'的簡短方式。 – 2011-04-03 18:36:20
是的。但是我想知道,編譯器如何將類似的東西翻譯成機器代碼/無論如何。 – fuz 2011-04-03 18:37:27
如果你對這些東西感興趣,我強烈建議你閱讀[PLAI](http://www.cs.brown.edu/~sk/Publications/Books/ProgLangs/2007-04-26/)。雖然它是Scheme而不是Haskell,但核心思想是一樣的。尤其請參閱第8章:實現Laizness並注意他們如何處理'closureV'值類型。 – 2011-04-04 04:58:33