【发布时间】:2012-07-28 00:54:57
【问题描述】:
由于我有大量的IDisposables 需要处理一段时间,因此我设置了一个一次性物品列表和一个传递函数,以将项目添加到其中作为副作用:
let mutable disposables = []
let (~-) (x:'a) = disposables <- x :: disposables; x
这样我就有希望做到这一点:
let thing1 = -new Form()
let thing2 = -new Control()
for i in disposables do i.Dispose()
问题在于 F# 自动将 'a 约束为 IDisposable,并带有警告消息:
这种构造导致代码比类型注释所指示的更通用。类型变量“a”已被限制为“IDisposable”类型。
那么operator ~-的返回类型就变成了IDisposable,这就破坏了函数的便利性。
有没有办法阻止 F# 创建这个约束?
【问题讨论】:
-
如果
disposables是IDisposable的列表,那么x除了IDisposable本身还能是什么?在任何情况下,你都可以给disposables一个显式类型,然后看看你会得到什么——我是一个Haskeller,所以这只是猜测。 -
let inline (~-) (x:'a) = disposables <- x :: disposables; x能解决这个问题吗? -
@JohnPalmer 不,
Local class bindings cannot be marked inline. Consider lifting the definition out of the class or else do not mark it as inline. -
@JonPurdy 我需要返回的
x是我发送的类型,而不是IDisposable。在disposables上注释类型似乎没有太大变化:( -
有很多更好的方法来做到这一点!
标签: f# type-inference