如何处理不同联合案例数据之间的共性?

dev*_*ium 1 .net f# functional-programming

我很高兴在我的代码上使用以下DU

type Token =
    | LET of Position
    | WS of Position
    | IDENTIFIER of Position * string
    | EQ of Position
    | NEWLINE of Position
    | PLUS of Position
    | MINUS of Position
    | TIMES of Position
    | DIV of Position
    | OPEN_BRACE of Position
    | CLOSE_BRACE of Position
    | INT32 of Position * int32
    | FLOAT32 of Position * float32
Run Code Online (Sandbox Code Playgroud)

直到我遇到需要Position从通用token变量中提取出来的情况.根据我的理解,除了直接将其重构为类似的东西之外,没有其他选择

type TokenType =
    | LET
    | WS
    | IDENTIFIER of string
    | EQ
    | NEWLINE
    | PLUS
    | MINUS
    | TIMES
    | DIV
    | OPEN_BRACE
    | CLOSE_BRACE
    | INT32 of int32
    | FLOAT32 of float32

type Token = Token of Position * TokenType
Run Code Online (Sandbox Code Playgroud)

对?定义一个

let position = function
  | LET(pos) -> pos
  | WS(pos) -> pos
   ...
Run Code Online (Sandbox Code Playgroud)

会太痛苦了.或者我错过了什么?

snf*_*snf 5

使用重构类型更有意义,因为position不是令牌类型的特定属性,而是令牌的一般属性.

在这里使用元组是最好的,但是如果你需要添加更多属性,我实际上会使用记录(也许你会在继续开发时发现它):

type Token = { Token_type: TokenType;
               Position: int;
               Length: int;
               ...
              }
Run Code Online (Sandbox Code Playgroud)