作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
考虑一下:
module Module1 =
type A() = class end
type B() = inherit A()
type C() = inherit A()
let f x = if x > 0 then new B() else new C()
let f x : A = if x > 0 then new B() else new C()
upcast
,像这样:
let f x : A = if x > 0 then upcast new B() else upcast new C()
upcast
仅在存在显式函数类型声明的情况下有效!
let f x = if x > 0 then upcast new B() else upcast new C()
最佳答案
正如 Carsten 的链接在某种程度上讨论的那样,类型推断和子类型不能很好地结合在一起。听起来您对 F# 的方法不满意,如果
if b then
e1
else
e2
if b then (e1 :> 'a) else (e2 :> 'a)
'a
和
e1
推断的类型另外推断
e2
是类型层次结构中的最小上限。
if
语句以这种方式运行,那么在
if
和
else
分支,因为它们总是可以通过隐式向上转换到
obj
来统一。然而,在实践中,这几乎总是一个程序员错误——你几乎总是希望类型相同(例如,如果我从一个分支返回一个字符,从另一个分支返回一个字符串,我可能打算从两个分支返回字符串,而不是
obj
)。通过隐式向上转换,您只会使这些错误的存在更难找到。
upcast
更短的解决方案,您可以尝试
:> _
,只要有一些限制类型的东西(整体结果上的注释或其中一个分支上的特定转换),它就会起作用.
关于visual-studio-2010 - 如何让 F# 推断通用基类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9893179/
我是一名优秀的程序员,十分优秀!