2013-11-23 22 views
1

我有一些代碼需要一個表達式,並使用它很好;麻煩的是,我的約束傳遞的表達式是PropertyGet是運行時間所限,無法編譯時間:如何將F#函數參數約束到PropertyGet?

member x.f(propertyExpr) = 
    match propertyExpr with 
    | PropertyGet(_, propOrValInfo, _) ->() // do something 
    | _ -> failwith "Unexpected expression type; needs PropertyGet" 

我真正喜歡的是在編譯時限制表達的類型。以下舉例說明了我的意圖:

member x.f(propertyExpr: Expr.PropertyGet) = 
    () // do something 

當然,這不會編譯。期望的屬性是:編譯時檢查 - 更安全,並且我有更少的例外擔心。但如何到達那裏?

回答

1

這是不可能做到的。即使將F#中的判別聯合體編譯到類層次結構中,也不允許將這些情況用作適當的類型。在Scala中,可以使用case類,但我相信沒有任何一個ML派生語言允許這樣做。

+0

這太糟糕了。 –