我有很多不同的類型有共同的目的,但沒有其他共同點。爲了便於說明,他們很可能會成爲沿着線:F#類型系統可以這樣做嗎?
type blah<'a> = Blah of 'a
type huha<'a> = Huha of 'a
我經常需要重複樣板的一大塊,可以去一個函數內部的線沿線的:
let f (x:something<int>) (g:something<char> -> float) : float =
但是,這需要以某種方式強制這兩種類型的東西是相同的。換句話說,我希望能夠調用的函數f:顯然
f (Blah 1) (fun (b:blah<float>) -> ....)
f (Huha 1) (fun (b:huha<float>) -> ....)
,一個簡單的解決方案是創建所有類型的函數f也可能採取的歧視工會,並讓每克(即f的第二個參數)檢查它得到任何類型的預期。但是這意味着擁有一個龐大的類型,在每次任何事情發生變化時都會導致Universe重新編譯,而且它不像在運行時檢查類型也有幫助。
那麼,有人可以看到一種做我想要的類型安全方式嗎?非常感謝。
由於這是.NET,你可以使用一個界面 - 但我不知道他們是F#中多麼普遍。 – phg 2012-07-28 10:17:20
接口在F#中實現,但我不確定這將如何幫助。所以我讓我所有的各種類型實現一些特定的接口。現在我只想寫一次代碼的副本需要進入每種類型。而當我想調用該代碼時,我需要動態調度來獲取正確的實例。但是實現必須具有相同的類型,因此我還需要使所有參數以一些常見方式運行。這似乎具有使用歧視工會的所有弊端,並且也會更加複雜?我錯過任何明顯的事情嗎? – user1559410 2012-07-28 10:50:11
我並不是想要在界面上實現實際的功能,但是像'extract:I - > a''。 (這取代了模式匹配)。然後你可以使'f'多態,但是將它限制到那個接口,然後提取與該類型相關的值:'f x g = g(extract x)'。這比union類型具有優勢,它可以自動擴展(不需要改變現有的類型定義)。我希望這就是你的意思。 – phg 2012-07-28 14:22:56