2008-09-27 32 views
101

功能語言很好,因爲它們通過消除狀態來避免錯誤,還因爲它們可以爲您自動輕鬆地進行並行處理,而無需擔心線程數量。如何在現實世界中使用函數式編程?

但是作爲一名Win32開發人員,我可以使用Haskell來處理我的應用程序的某些DLL嗎?如果我這樣做,是否有一個真正的優勢,我會自動採取?如果是這樣,編譯器是什麼給了我這個優點?

F#能夠自動爲多核心和cpu自動編寫並行化函數嗎?你會看到任務管理器中的線程數增加嗎?

基本上我的問題是,我怎樣才能以一種實用的方式開始使用Haskell,如果我能真的看到一些好處嗎?

+2

就我個人而言,我會研究二郎 - 但那就是我。 – 2008-09-27 04:13:16

+1

爲了澄清一點,我已經有幾種不同的函數式編程語言的經驗,並且我知道它們是如何工作的以及它們的區別是什麼。但是,這個問題具體是:我如何把它帶到現實世界的使用。 – 2008-09-27 04:15:06

+1

[爲什麼功能語言?]可能重複(http://stackoverflow.com/questions/36504/why-functional-languages) – 2010-05-27 02:53:03

回答

6

我現在正在學習Haskell,當你開始學習Haskell時,它似乎並不是很吸引人,因爲學習體驗不像學習像C#這樣的語言,它是一個全新的世界,但我注意到我可以只需幾行代碼即可編寫非常複雜的表達式,當我回顧代碼時,它更加簡潔,小巧緊湊。我絕對喜歡它!你確實可以編寫真實世界的程序,這些程序會更小,更容易維護,而且大多數其他語言都允許更復雜,我投票支持你學習它!

祝你好運。

23

F#不包含任何魔術精靈灰塵,將功能傳遞給不同的CPU或機器。 F#/ Haskell和其他函數式編程語言的作用是使您可以更輕鬆地編寫獨立於其創建的線程或CPU而獨立處理的函數。

我覺得不適合在這裏發佈一個鏈接到我參與的播客,似乎有點關閉,但是在與馬特·波德維斯基談話的牧羣代碼插曲中,我們問了同樣的問題,他給出了一些有趣的答案。在這一集中,還有很多與功能性編程有關的良好鏈接。我發現一個鏈接標題「Why Functional Programming Matters」這可能會爲您提供一些答案。

13

這也可能是有趣: 「Real World Functional Programming

例子是在F#和C#,但理論是相當通用的。 從我讀過的(預發佈)這絕對是有趣的,但到目前爲止,我認爲它使我想要越來越多地使用C#,使用並行擴展庫等。

7

你沒有提到,但我假設你正在使用C++。進入功能的一個潛在的簡單方法是通過C++/CLI到F#。 C++包含「magic magic dust」(稱爲IJW:It Just Works),允許您調入和調出託管代碼。有了這個,調用F#代碼幾乎和C#一樣簡單。

我已經在一個程序(FreeSWITCH)中使用了它,它完全用C/C++編寫。通過一個託管的C++/CLI(使用/ clr開關),它會奇蹟般地轉換爲託管代碼,然後我可以加載我的F#插件並執行它們。爲了使部署變得更容易,F#可以靜態鏈接所有的依賴關係,因此您不需要部署F#運行時文件。使CLR代碼更具吸引力的另一件事是,您可以將託管代碼(委託)傳遞給C代碼,並且運行時會自動爲您製作一個thunk。

如果您決定採用Haskell方式,您要查找的功能是FFI:外部函數接口。但是,我認爲它不會像F#中的C++/CLI那樣提供相同級別的集成。

4

既然你提到Win32和DLL,我認爲你正在使用非託管代碼。在那種情況下,GHC對你來說效果很好。去年年底,我在Windows下使用FFI編寫了一個DDE服務器來與MS DDE庫進行交流,而且,令人驚訝的是,這是一個非常愉快的體驗(尤其是考慮到我是一名Unix人員)。 Haskell的FFI功能強大(甚至支持,例如,從C或其他庫中回調Haskell函數),並且在編寫C級代碼時Haskell的類型檢查就像夢一樣成真。

最後一點是Haskell的主要優點之一:類型系統非常棒。這就是說,它就像任何強大的工具;它需要時間和精力來充分利用它。

所以,可以開始在Haskell中編寫一小段代碼鏈接到代碼的其餘部分(儘管您可能會發現從小型Haskell程序鏈接到其他代碼更容易),並且很值得花費大量時間瞭解這一點並儘可能地使用它。您最終可能會像我一樣,計劃一個與Windows代碼緊密集成的相當重要的項目(在我的情況下,是一個複雜的Excel加載項)在Haskell中。

相關問題