假設我有以下DU:從F#DU訪問特定的情況下
type Something =
| A of int
| B of string * int
現在我用它的功能是這樣的:
let UseSomething = function
| A(i) -> DoSomethingWithA i
| B(s, i) -> DoSomethingWithB s i
這樣的作品,但我不得不解構DU爲了將它傳遞給DoSomethingWith *函數。我很自然地試圖將DoSomethingWithA定義爲:
let DoSomethingWithA (a: Something.A) = ....
但編譯器抱怨類型A沒有定義。
這似乎完全符合F#的哲學,希望將參數限制爲Something.A,而不僅僅是任何舊的int,所以我只是以錯誤的方式進行討論?
感謝鏈接變形 - 看起來像一個偉大的系列,並且你對地圖函數的建議是有道理的。我同意處理一個DU的所有情況是件好事:只要我知道我有一個A就會感覺到,我應該能夠繞過這個A而不是被迫傳遞一個東西。也許我被我的面向對象背景知識絆倒了,A和B都被實現爲Something的子類型? – Akash 2013-03-15 11:21:11
+1「解構所有DU的案例是一個好主意,因爲它是類型安全的,迫使你想到處理這些案例,即使你不想要」 – 2013-03-15 11:41:08
@Akash:你是對的。繼承可以用來模擬DU,但模式匹配和窮舉檢查變得更乏味。就OOP和DU之間的差異(在強度和弱點等方面)而言,我發現這篇論文很有啓發意義,這篇論文http://www.cs.utexas.edu/~wcook/papers/OOPvsADT/CookOOPvsADT90.pdf。 – pad 2013-03-15 12:05:31