簡體   English   中英

Haskell和LINQ之間有什么聯系嗎?

[英]Are there any connections between Haskell and LINQ?

我使用LINQ在C#中編寫了一些查詢。 過了一會兒,我開始使用Haskell一點點,這是一種函數式編程語言(一種不那么受歡迎的語言),而對我來說似乎它們幾乎都是一樣的。 但我不確定這一點。 如果有人比我更多地使用它們,他們能不能告訴我它們在編程原理上是否幾乎相同?

LINQ可以被認為是函數式編程嗎?

謝謝。

對我而言,似乎兩者幾乎都是一回事。 但我不確定這一點。 如果有人比我更多地使用它們,他們能不能告訴我它們在編程原理上是否幾乎相同?

是的,LINQ查詢理解的設計很大程度上受到Haskell設計的影響。 當我們設計LINQ時,Haskell專家Erik Meijer加入了C#語言設計委員會; 他的見解非常寶貴。 (我在這個過程結束時加入了設計團隊,所以不幸的是我沒有參與所有有趣的曲折,這些年來設計經歷了多次;它開始變得更加傳統OO而不是最終!)

如果你最近對Haskell進行了認真的探索,那么你可能已經熟悉了monad的想法。 LINQ語法專門設計用於使序列monad上的操作感覺自然,但實際上實現更通用; C#調用“SelectMany”是對任意monad的“綁定”操作的略微修改形式。 你可以使用任何monad實際使用查詢理解, 正如我的同事Wes在這里描述的那樣 ,但這樣做看起來很奇怪,我建議在生產代碼中反對它。

LINQ可以被認為是函數式編程嗎?

是的,LINQ深受功能編程思想的影響。 它旨在將函數視為一等對象,強調對副作用的計算等。

看看Erik Meijer Lecture可能是值得的。 這是對它的描述。

我們帶着功能性語言純粹主義者和lambda演算的大祭司Erik Meijer博士進入C9講座,進入功能編程世界(你可以感謝Erik的許多功能結構,這些結構已經出現在像C#這樣的語言中VB.NET。當你使用LINQ時,感謝Erik除了Anders之外。

確實,C#已經獲得了函數式編程的某些方面。 首先是lambda語句,作為匿名委托實現。 您現在不再需要將方法定義為屬於對象,並且您可以以與任何其他變量類似的方式定義方法。 這允許許多功能類型的構造:

var mult = (a,b)=>a*b;
var square = (a)=>Math.Pow(a,2);
var multandsquare = (a,b)=>square(mult(a,b));

//None of the above give a lick about what a and b really are, until...
multandsquare(5,3); //== 225

函數式編程的基本范例 - 基本上可以告訴計算機做的任何事情都可以用高階函數來表示 - 可以應用於C#程序,特別是現在C#實際上具有更高階函數。 編譯器將強制你至少有一個類至少有一個公共main方法(這就是OO的工作方式),但從那時起你只能根據函數來定義幾乎所有東西(def:“方法”的子類)采用N個參數並產生1個輸出而沒有“副作用”)實例化為lambdas。

Linq確實有一些功能結構。 基本上它的方法鏈范例是monadic處理的一個例子,它是通過操作封裝在函數語言中(現在在C#中)來構造操作序列的。 在IEnumerable上調用Linq方法會返回另一個IEnumerable,它實際上是一個不同的具體類,它包含源Enumerable的句柄和一些要執行的lambda。 您可以非常簡單地用函數式語言復制它; 它是源的元組(本身是當前元素和其他所有元素的元組)和一個執行的函數,它將源元組轉換為結果,一次一個元素(在Linq中,因為它將在函數中實現) language,是將某些操作嵌套到定義的“匯總”函數中)。 調用必須產生實際答案的方法(具體的類型結果),並充分評估所有這些函數以產生所需的結果。

LINQ也可以被認為是函數式編程嗎?

LINQ意味着一種功能風格,因為它類似於SQL select,原則上它是只讀的。 但是,因為.NET中的LINQ子句是由普通的CLR例程實現的,所以沒有什么可以阻止LINQ表達式修改狀態。

另一方面,Haskell是一種“純粹的”函數式語言,因此表達式無法修改全局狀態。 盡管可以執行IO和圖形操作,但這些操作使用與.NET中任何東西完全不同的慣用語來執行 - 包括F#,它允許您或多或少透明地使用程序樣式。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM