2016-11-09 8 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, и в качестве альтернативы обертку далее в Expression:

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)] 

Это говорит, держа ключ поскольку простая строка, конечно, менее сложна.