通用约束:一个类型参数继承自另一个

时间:2013-06-17 09:47:17

标签: generics f#

我正在尝试用两个类型参数编写一个通用的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约束?我做错了吗?

0 个答案:

没有答案