我正在尝试编写一个具有两个类型参数的通用 F# 函数,其中一个从另一个继承。(我正在编写针对 Nancy 的代码,它在 TinyIoC 容器代码中使用了一些有趣的通用约束。)
我可以像这样用 C# 编写它:
using System;
class Program {
static Func<T> Factory<T, U>(Lazy<U> lazy) where U : T {
return () => lazy.Value;
}
static void Main() {
var f = Factory<IComparable, string>(new Lazy<string>(() => "hello " + "world"));
Console.WriteLine(f());
}
}
我认为这是等效的 F#:
open System
let factory<'a, 'b when 'b :> 'a> (l : Lazy<'b>) : unit -> 'a =
fun () -> l.Value :> 'a
let f = factory<IComparable, _>(lazy "hello " + "world")
printfn "%s" (f ())
...但是当我尝试这个时,我收到一个针对“工厂”功能的错误:
错误FS0698:无效约束:用于约束的类型是密封的,这意味着约束只能由最多一种解决方案满足
是否可以在 F# 中编写 C# 的where U : T
约束?我做错了吗?