2012-12-07 58 views
28

很酷的新F#3.0功能類型提供者可以用來彌補F#數據類型或類與數據源結構(如XML或WSDL)之間的不匹配。然而,這種不匹配在C#等其他.NET語言中也是一個挑戰。F#類型提供者是否可以併入C#

我想在C#代碼中使用F#3.0提供程序。我怎麼能這樣做,如果有的話?此外,如果我們不能,那麼C#實現需要能夠使用它們呢?

+1

這應該是社區wiki的形式。我相信這會引發相當長的討論。 –

回答

9

類型提供程序如何工作的某些方面特別適合F#程序員的需求,但在考慮解決其他語言的強類型數據訪問時可能不那麼引人注目。例如,很多F#編程都是在F#Interactive中完成的,與代碼生成器(需要用於生成源代碼文件的語言外部機制)相比,類型提供程序能夠非常好地實現此工作流程。由於C#程序員習慣於慢編輯 - 編譯運行週期,所以在C#設置中這可能不那麼重要。從技術角度來看,我懷疑F#的更普遍類型推斷可能是與C#等語言相比最大的優勢。舉例來說,如果我想從另一個類型的類型提供換一些數據訪問邏輯,我可以做這樣的事情:

let moviesStartingWith prefix = 
    query { 
     for movie in MyDataSource.Movies do 
     where (movie.Title.StartsWith(prefix) } 
    |> Seq.toList 

在C#中,我需要指定返回類型(例如List<DataSource.ServiceTypes.Movie>)這最終是一件雜事,這意味着即使使用IntelliSense,我也會點擊提供的一組類型來生成簽名,除了點擊提供的值來生成查詢外。

當然,這也適用於類型提供者以外的領域,但我認爲,對於某些提供者自然生成的某些嵌套類型層次結構,這在實踐中會特別痛苦,因爲類型名稱變爲非常長。

+2

C#類型推斷可能會比你給的功勞更好。即使這是一種方法而不是內聯語句,人們可以在方法簽名上放置一個類型參數,並且在MyDataSource.Movies中傳遞的行爲將綁定類型參數,而不需要指定關閉的類型,返回類型'列表'。 – codekaizen

24

我認爲@kvb很好地概括了一些技術難點。我同意類型推斷會有問題 - 您將基本上侷限於在本地使用提供程序生成的類型,類似於匿名類型。我認爲C#可能出現在羅斯林類似的東西,但我懷疑這將是優雅和順利地集成是在F#(其中類型供應商實際上是語言功能並不僅僅是工具)。

要回答你的兩個具體的問題:

[我怎麼能]使用F#3.0中提供的C#代碼?

F#類型的提供者實際上只被F#編譯器理解,所以你需要從F#中使用它們。對於生成的類型提供程序(SQL,實體,WSDL,配置文件),您可以引用來自F#的提供程序並使用C#項目中生成的類型。

對於刪除類型提供程序,您將無法執行此操作,因爲類型並不存在,只有F#可以看到它們。所以最好的選擇是在F#中編寫處理代碼,並將結果作爲記錄或其他類型的集合返回,這些記錄或其他類型很容易從C#中使用。

C#實現需要什麼才能使用它們?

我當然可以說「C#將不得不支持類型提供者!」,但這裏有更多的想法。類型提供者只是.NET程序集,他們不使用任何F#特定類型。 ITypeProvider interface可以被任何.NET語言(包括C#)使用,所以如果C#設計人員想要,他們可以重用已經爲F#構建的所有優秀提供程序。

因此,將此建議提交給C# user voice或在其他地方倡導(或者說服Mono團隊實施此操作!),並且可能會將其添加到C#中(vNext + 1 + ...)。目前,您只能在F#中獲得所有優勢。

+0

感謝您的好評。我不確定我是否完全理解生成類型和擦除類型提供者之間的區別。我在哪裏可以找到有關此主題的其他信息?我想世界銀行類型的提供者是一個擦除類型提供者的例子。但是,如何一個CSV類型的提供者。它也是一個擦除類型的提供者? – carstenj

+0

「所以最好的選擇是在F#中編寫處理代碼,並將結果作爲記錄或其他類型的集合返回,這些記錄或其他類型很容易從C#中使用。」你有這樣的代碼示例嗎? –

+0

@無名我對此做了一個Pluralsight視頻:https://www.pluralsight.com/courses/accessing-data-fsharp-type-providers它實際上在未來2天內免費提供(但你應該以後也能獲得免費試用)。 –

相關問題