2016-11-09 16 views
5

Giả sử tôi có một kiểu như thế này trong F #:Làm cách nào để sử dụng một chi nhánh công đoàn phân biệt trong một tham số kiểu?

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

Bây giờ tôi muốn sử dụng loại này để xây dựng một bản đồ:

definitions : Map<Identifier, Expression> 

Tuy nhiên, điều này mang đến cho các lỗi:

The type 'identifier' is not defined

Làm cách nào tôi có thể sử dụng loại trường hợp của tôi làm thông số loại?

Trả lời

5

Identifier là một nhà xây dựng trường hợp trường hợp, không phải loại. Nó thực sự là một chức năng với loại string -> Expression. Các loại trường hợp là string, vì vậy bạn có thể xác định definitions như

type definitions : Map<string, Expression> 
3

Có một cách khác trong trường hợp bạn muốn chìa khóa để trở thành một loại hình cụ thể (ví dụ) không chỉ là một chuỗi. Bạn chỉ có thể tạo StringID loại, và cách khác quấn mà thêm vào một Expression:

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

này sẽ cho phép bạn tạo ra một bản đồ bằng một trong các cách sau:

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

Điều đó nói rằng, giữ phím như một chuỗi đơn giản chắc chắn là ít phức tạp hơn.

Các vấn đề liên quan