F# 针对printformat编写单元测试

F# 针对printformat编写单元测试,f#,F#,我有一种类型,我正试图通过编写针对它的单元测试来理解它,但是我无法推理如何使用printformat type ValueFormat<'p,'st,'rd,'rl,'t,'a> = { format: PrintfFormat<'p,'st,'rd,'rl,'t> paramNames: (string list) option handler: 't -> 'a } with static m

我有一种类型,我正试图通过编写针对它的单元测试来理解它,但是我无法推理如何使用printformat

  type ValueFormat<'p,'st,'rd,'rl,'t,'a> = {
      format: PrintfFormat<'p,'st,'rd,'rl,'t>
      paramNames: (string list) option
      handler: 't -> 'a
    }
    with 
      static member inline construct (this: ValueFormat<_,_,_,_,_,_>) =
        let parser s = 
          s |> tryKsscanf this.format this.handler
            |> function Ok x -> Some x | _ -> None
        let defaultNames =
            this.format.GetFormatterNames() 
              |> List.map (String.replace ' ' '_' >> String.toUpperInvariant)
              |> List.map (sprintf "%s_VALUE")
        let names = (this.paramNames ?| defaultNames) |> List.map (sprintf "<%s>")
        let formatTokens = this.format.PrettyTokenize names
        (parser, formatTokens)
类型值格式={
格式:打印格式'a
}
具有
静态成员内联构造(this:ValueFormat)=
设解析器s=
s |>trykscanf this.format this.handler
|>功能正常x->部分x | ux->无
让默认名称=
this.format.GetFormatterNames()
|>List.map(String.replace'''>>String.toupper不变量)
|>List.map(sprintf“%s\u值”)
let names=(this.paramNames?| defaultNames)|>List.map(sprintf“”)
让formatTokens=this.format.PrettyTokenize名称
(解析器、格式化令牌)
我相信我能把一切都弄清楚,但PrintfFormat给了我所有的仿制药

我要进行单元测试的代码的文件是

我的问题是,什么是printformat,应该如何使用它


指向printf.fs文件的链接为。它包含printformat的定义,
printformat我最初有两个问题,但有人投票决定结束,因为我有两个问题。我回答了第二个问题。太好了!现在我很好奇这个字符串是如何转换成printformat类型的。无论如何,这足以解除我的障碍,这样我就可以继续我的单元测试,并理解我开始学习的原始项目。谢谢你抽出时间回答我的问题!格式字符串在F#编译器中变为
printformat
  type ValueFormat<'p,'st,'rd,'rl,'t,'a> = {
      format: PrintfFormat<'p,'st,'rd,'rl,'t>
      paramNames: (string list) option
      handler: 't -> 'a
    }
    with 
      static member inline construct (this: ValueFormat<_,_,_,_,_,_>) =
        let parser s = 
          s |> tryKsscanf this.format this.handler
            |> function Ok x -> Some x | _ -> None
        let defaultNames =
            this.format.GetFormatterNames() 
              |> List.map (String.replace ' ' '_' >> String.toUpperInvariant)
              |> List.map (sprintf "%s_VALUE")
        let names = (this.paramNames ?| defaultNames) |> List.map (sprintf "<%s>")
        let formatTokens = this.format.PrettyTokenize names
        (parser, formatTokens)
open FSharp.Reflection

let myscan (fmt:PrintfFormat<'Printer,obj,obj,string,'Tuple>) : 'Tuple = 
  let args = 
    fmt.Value 
    |> Seq.pairwise
    |> Seq.choose (function
      | '%', 'd' -> Some(box 123)
      | '%', 's' -> Some(box "yo")
      | _ -> None)
  unbox <| FSharpValue.MakeTuple(Seq.toArray args, typeof<'Tuple>)
  
myscan "%d %s %d"