2

一方が他方を継承する 2 つの型パラメーターを持つ汎用 F# 関数を作成しようとしています。(私は、TinyIoC コンテナー コードでいくつかの興味深い一般的な制約を使用する Nancy に対してコードを書いています。)

次のように 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 ())

...しかし、これを試すと、「factory」関数に対してエラーが発生します。

エラー FS0698: 無効な制約: 制約に使用される型が封印されています。これは、制約が最大 1 つのソリューションによってのみ満たされる可能性があることを意味します

where U : TF# で C# の制約を記述できますか? 私はそれを間違っていますか?

4

0 に答える 0