2016-11-09 75 views
5

假設我有在F#類型是這樣的:如何在類型參數中使用歧視聯合分支?

type public Expression = 
    | Identifier of string 
    | BooleanConstant of bool 
    | StringConstant of string 
    | IntegerConstant of int 
    | Vector of Expression list 
    // etc... 

現在我想用這個類型,在地圖:

definitions : Map<Identifier, Expression> 

然而,這給出了錯誤:

The type 'identifier' is not defined

如何將我的類型用作類型參數?

回答

5

Identifier案例構造函數,而不是一個類型。它實際上是一個類型爲string -> Expression的函數。該類型的情況下是string,這樣你就可以定義爲definitions

type definitions : Map<string, Expression> 
3

有你想要的關鍵是一個特定的類型(即)不只是一個字符串的情況下,另一種方式。您只需創建的StringID類型,或者進一步包裝成一個表達式:

type StringId = Sid of string 
type Expression = 
    | StringId of StringId 
    | BooleanConstant of bool 
    | StringConstant of string 
    | IntegerConstant of int 
    | Vector of Expression list 

這將讓你在以下任一方式創建地圖:

let x = Sid "x" 
[StringId x ,BooleanConstant true] |> Map.ofList 
//val it : Map<Expression,Expression> = map [(StringId (Sid "x"), BooleanConstant true)] 

[x,BooleanConstant true] |> Map.ofList 
//val it : Map<StringId,Expression> = map [(Sid "x", BooleanConstant true)] 

這就是說,保持關鍵作爲一個簡單的字符串肯定不那麼複雜。

相關問題