我要實現原語如何定義識別聯合運營商在F#
type point = double * double
type shape =
| Point of point
| Line of point * point
| Vector of point
| Circle of point * double
with
member this.ToString = function
| Point (x,y) -> sprintf "(%f; %f)" x y
| Vector (x,y) -> sprintf "(%f; %f)" x y
| Line ((x0,y0),(x1,y1)) -> sprintf "(%f; %f)->(%f; %f)" x0 y0 x1 y1
| Circle ((x0,y0),radius) -> sprintf "(%f; %f)r%f" x0 y0 radius
let inline (-) (Point (x0,y0)) (Point (x1,y1)) = Vector (x0-x1,y0-y1)
let inline (+) (Point (x0,y0)) (Vector (x1,y1)) = Point (x0+x1,y0+y1)
,編譯器說,在運營商的模式匹配並不詳盡,雖然這只是一個警告之間的一些幾何運算代碼。如何在沒有編譯器抱怨的情況下,只在DU的特定子類型之間正確實現運算符?
我終於明白,沒有類型安全的設計和DU設計之間略有緊張。在編譯時,我想知道我不能從一個圓中減去一個矢量,而只能從一個點中減去一個矢量。然而在其他時候,我可能希望在不同類型的形狀上進行模式匹配,並讓編譯器確保模式匹配儘可能詳盡,例如DU的可能性。我想我會選擇一個面向對象的層次結構,因爲它適合我需要的更好的東西。我想我有很多DU的使用形狀介紹教程(即http://msdn.microsoft.com/en-us/library/dd233226.aspx) – bradgonesurfing
旁邊跟蹤雖然這個答案可能會給我我需要的東西http ://stackoverflow.com/a/8133470/158285 – bradgonesurfing