gpt4 book ai didi

f# - 使用 F# 事件模式的令人困惑的错误

转载 作者:行者123 更新时间:2023-12-01 06:03:27 25 4
gpt4 key购买 nike

为什么会编译:

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)

在您的原始代码中,尽管您有注释 (o:obj) , F# 推断 o实际上可以是任何类型 'a ,这导致类型为 bool -> Choice<unit,'a -> obj> 的通用事件模式.因为'a是一个自由类型变量,F# 不会接受这个事件模式定义。如果您执行以下操作,您会看到类似的问题:

let (|T|F|) b =   
if b then T else F []

同样,解决方案是将定义单态化:

let (|T|F|) b : Choice<unit,int list>  =   
if b then T else F []

关于f# - 使用 F# 事件模式的令人困惑的错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3843315/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com