Я пытаюсь использовать PrintfFormat
для принудительного ввода разрешения синтаксических анализаторов, и изначально он работал для int
, но затем тот же подход для string
не работал ... в то время как float работал, поэтому я подумал, что Ошибка типа Value / Ref, но затем попытался bool
, и это не сработало как String.
int
& float
работают, string
& bool
нет!?
(методы ParseApply на данный момент являются фиктивными реализациями)
type System.String with static member inline ParseApply (path:string) (fn: string -> ^b) : ^b = fn ""
type System.Int32 with static member inline ParseApply (path:string) (fn: int -> ^b) : ^b = fn 0
type System.Double with static member inline ParseApply (path:string) (fn: float -> ^b) : ^b = fn 0.
type System.Boolean with static member inline ParseApply (path:string) (fn: bool -> ^b) : ^b = fn true
let inline parser (fmt:PrintfFormat< ^a -> ^b,_,_,^b>) (fn:^a -> ^b) (v:string) : ^b
when ^a : (static member ParseApply: string -> (^a -> ^b) -> ^b) =
(^a : (static member ParseApply: string -> (^a -> ^b) -> ^b)(v,fn))
let inline patternTest (fmt:PrintfFormat< ^a -> Action< ^T>,_,_,Action< ^T>>) (fn:^a -> Action< ^T>) v : Action< ^T> = parser fmt fn v
let parseFn1 = patternTest "adfadf%i" (fun v -> printfn "%i" v; Unchecked.defaultof<Action<unit>> ) // works
let parseFn2 = patternTest "adf%s245" (fun v -> printfn "%s" v; Unchecked.defaultof<Action<unit>> ) // ERROR
let parseFn3 = patternTest "adfadf%f" (fun v -> printfn "%f" v; Unchecked.defaultof<Action<unit>> ) // works
let parseFn4 = patternTest "adfadf%b" (fun v -> printfn "%b" v; Unchecked.defaultof<Action<unit>> ) // ERROR
Ошибка, которую я получаю при вводе result2
строки формата функции: The type 'string' does not support the operator 'ParseApply'
, аналогично result4
ошибка The type 'bool' does not support the operator 'ParseApply'
.
Я не знаю, почему это несоответствие, это ошибка или я что-то упустил?