使用F#活动模式混淆错误

使用F#活动模式混淆错误,f#,F#,为什么要编译: let (|T|F|) b = let f (o:int) : obj = null if b then T else F(f) 尽管这样做失败了: let (|T|F|) b = let f (o:obj) : obj = null if b then T else F(f) 这两个示例之间的区别在于,参数“o”被强制为“int”(编译)或“obj”(未能编译)这是一种不幸的类型推断情况。这将有助于: let (|T|F|) b : Ch

为什么要编译:

let (|T|F|) b = 
    let f (o:int) : obj = null
    if b then T else F(f)
尽管这样做失败了:

let (|T|F|) b = 
    let f (o:obj) : obj = null
    if b then T else F(f)

这两个示例之间的区别在于,参数“o”被强制为“int”(编译)或“obj”(未能编译)

这是一种不幸的类型推断情况。这将有助于:

let (|T|F|) b : Choice<unit,obj -> obj> =   
  let f (o:obj) : obj = null
  if b then T else F(f)
同样,解决方案是将定义单态化:

let (|T|F|) b : Choice<unit,int list>  =   
  if b then T else F []
let(| T | F |)b:Choice=
如果是b,那么是T,否则是F[]

我忍不住想知道你的目标是什么。是的,我知道它的奇怪代码。我在F#类型上编写一些反射代码,活动模式返回一个在“obj”上运行的函数。我发布的代码显然是无用的:)
let (|T|F|) b : Choice<unit,int list>  =   
  if b then T else F []