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