不久我和我的兄弟Joel將發佈0.9版Wing Beats。這是一個用F#編寫的內部DSL。有了它,你可以生成XHTML。靈感來源之一是Ocsigen框架的XHTML.M模塊。我不習慣OCaml語法,但我確實理解XHTML.M以某種方式靜態檢查元素的屬性和子元素是否爲有效類型。F#和靜態檢查工會案件
我們還沒有能夠靜態檢查F#中的同一個東西,現在我想知道如果有人有任何想法如何做到這一點?
我的第一個幼稚的方法是在XHTML中將每個元素類型表示爲一個聯合案例。但不幸的是,你不能靜態地限制哪些情況作爲參數值有效,就像在XHTML.M中一樣。
然後我嘗試使用接口(每個元素類型實現每個有效父級的接口)和類型約束,但是我沒有設法使它在沒有使用顯式強制轉換的情況下工作,這使得解決方案變得非常繁瑣使用。無論如何,它並不是一個優雅的解決方案。
今天我一直在看代碼合同,但它似乎與F#Interactive不兼容。當我擊中ALT +輸入它凍結。
只是爲了讓我的問題更清楚。這裏是同一個問題的一個超級簡單的人工例如:
type Letter =
| Vowel of string
| Consonant of string
let writeVowel =
function | Vowel str -> sprintf "%s is a vowel" str
我想writeVowel只接受元音靜態的,而不是如上述,在運行時檢查。
我們該如何做到這一點?有人有什麼主意嗎?必須有一個聰明的方式來做到這一點。如果不是工會案件,也許與接口?我一直在努力,但我被困在盒子裏,無法想到它。
請問您能否將代碼合同示例凍結FSI到fsbugs(at)microsoft dot com? – Brian 2010-05-12 01:08:18