2011-10-25 63 views
5

檢查類型,所以我正在學習F#,又看了看這個:如何F#類型提供程序在編譯時

F# type providers, how do they work

這:

http://msdn.microsoft.com/en-us/library/hh361033(v=vs.110).aspx

我在F#中不是很流暢,但我的(可能不完整的)理解是類型提供者是爲了給你某種對外部數據源的靜態類型安全訪問。

但是,他們如何做到這一點?由於數據源是外部的,因此似乎(在我看來)沒有辦法檢查數據源的模式而不用查詢它,並且在編譯時(以及代碼完成!)查詢東西似乎是一個壞主意。

如果他們不這樣做,但是,必須有一些鑄造去到未知的數據源撒入一些架構(然後可以進行類型檢查),其中有失敗的可能性,如果數據源不能鑄造。

回答

7

你問了幾個很好的問題:

  1. 是否型供應商接觸編譯期間外部數據源?

    是的。 FSharp.Data.TypeProviders命名空間中提供者的基本思想是,它們每個都包裝一個代碼生成器。因此,要在C#或其他大多數語言中做同樣的事情,您需要有一個明確的代碼生成步驟(在「編譯時」之前/之前聯繫數據源)。在F#中,該過程更加無縫,但原則上非常相似。由類型提供者訪問的數據源揭示了相對有效的查詢模式的方式,並且類型提供者包含用於最小化編譯期間往返次數的邏輯。

  2. 如果模式發生變化或數據庫脫機或發生什麼情況?

    一般來說,這取決於類型提供者,但內置類型提供者向用戶公開了一些選項。特別是,可以指出提供者應該緩存架構的本地副本以防數據庫變得不可訪問(或者,也可以強制提供者反對實時數據,以便在編譯期間立即報告錯誤if任何不匹配發生)。

    再次,這是不是在其他語言的代碼生成方法也不同 - 如果架構從你下了變化,您可以快速失敗(如果不再重新生成代碼和引用生成的代碼按照預期排隊),或者你可以嘗試混淆(例如,永遠不要重新生成代碼,並希望在運行時排隊)。

這些答案適用於內置的供應商,但作爲一個供應商,作家有人能肯定會選擇做不同的事情(雖然我認爲我已經介紹的方法很有意義,爲廣大的外部數據源)。

+1

我相信你,但仍然很難相信。這意味着Visual Studio會在編譯(和代碼完成)過程中實際發送http請求和數據庫查詢以及所有這些事情來獲取模式?我已經編程了一段時間,我不認爲我在其他地方見過這種事情,通常在與外部數據存儲的接口上總是存在隱式轉換。有什麼地方可以查看這個概念,而不是針對F#嗎? –

+5

觀看此約3分鐘的內容:http://channel9.msdn.com/events/BUILD/BUILD2011/SAC-904T從25:30開始。是的,當你按''。在IDE中,Visual Studio正在發送Web請求以獲取另一個架構來呈現Intellisense自動完成。它可能是新穎的,而且非常棒:) – Brian

相關問題