2016-11-06 69 views
2

我想從Quotation的記錄中獲取字段的輸入值。它似乎應該是直線前進,但我有點失落。從報價中獲取字​​段值並將其轉換爲其類型

例如,

type FullName = { First : string; Last : string } 

type Name = { Name : FullName } 

let t = { Name = { First = "Jon"; Last = "N" } } 

let name = <@ t.Name.First @> 

然後我想借值name並獲得Jonstring(不是obj)。我將如何做到這一點?有時返回值可能是Array或另一個Record

在此先感謝!

更新:

所以需要檢查null我將使用該功能在F#的邊緣:

let getValue (expr: Quotations.Expr<'t>) = 
    match eval expr with 
    | null -> None 
    | x -> Some ((eval expr) :?> 't) 
+0

看起來你需要編譯和執行報價。或者我錯過了什麼? – Gustavo

+0

如何從報價中提取實際值與其類型?對不起,我不確定如何更清楚。 – Jon49

+0

現在我只是在劇本中玩它。我發現這個片段讓我在一半的地方,但它返回到'obj' http://www.fssnip.net/h1 – Jon49

回答

4

你鏈接的eval script將讓你有一半 - 它會爲你計算表達式的實際值。現在,所有剩下要做的就是該值轉換爲適當的類型:

let getValue (expr: Quotations.Expr<'t>) = (eval expr) :?> 't 

let valueOfName = getValue name // valueOfName : string 

記住理論上投可能會崩潰,但在實踐中不應該發生,因爲eval總是返回正確類型的值(除非它有一個錯誤)。

相關問題