根据模式匹配 (F#) 中的字符串输入返回不同的区分联合状态


type ColType = I of int | S of string | F of float

我知道您不能从模式匹配中返回不同的类型,这就是为什么我首先为我正在创建的解析器制作此类型的原因。但是,使用此代码:

//create i coltype
let m (x : int) : ColType =
ColType.I x
//create f coltype
let n (x : float) : ColType = 
ColType.F x
//create s coltype
let b (x : string) : ColType = 
ColType.S x    
let pColType =
let innerFn (charList : char list) = 
let i = String(List.toArray charList)
match i with   
| "int"  -> m
| "float" ->  n
| "string" -> b
many1 parseLowercase |>> innerFn

尽管 m、n 和 b 返回相同的类型,但它仍然会在 pColType 函数中给我一个错误。

诸如parseLowercase等代码只是获取字符串的代码,这是按预期运行的,问题是返回值尽管都是coltype,但返回值并不相同?(尽管它的状态不同)。

就像 rmunn 和 Romanov 提到的,你的 3 个函数属于不同的类型。例如,您可以使用box&unbox让它们返回单个类型obj -> ColType

let pColType =
let innerFn (charList : char list) = 
let i = String(List.toArray charList)
match i with   
| "int"    -> unbox >> m
| "float"  -> unbox >> n
| "string" -> unbox >> b
|_-> failwithf "error %A" i
many1 parseLowercase |>> innerFn

这要求您在调用生成的函数之前box该值。 由于您正在构建一个解析器,因此让它返回一个string -> ColType更有意义:

let pColType =
let innerFn (charList : char list) = 
let i = String(List.toArray charList)
match i with   
| "int"    -> parseInt    >> m
| "float"  -> parseFloat  >> n
| "string" -> parseString >> b
|_-> failwithf "error %A" i
many1 parseLowercase |>> innerFn

相关内容

  • 没有找到相关文章

最新更新