3
良いと期待どおり型推論の回避策
let oi = checkOne (One 1)
let os = checkOne (One "1")
let tis = checkTwo (Two (1, "1"))
let tsi = checkTwo (Two ("1", 1))
私は好きなようにタイプを切り替えることができます。
は今、私は
let makeUC() = (checkOne, checkTwo)
1つの作成機能にそれらの二つの機能を組み合わせて、その後にのみ、それは私に実際に今
Value restriction. The value 'o' has been inferred to have generic type
val o : (SomeDU2<'_a,'_b> -> bool)
Either make the arguments to 'o' explicit or, if you do not intend for it to be generic, add a type annotation.
val o : (SomeDU2<obj,obj> -> bool)
このエラーメッセージを表示します。この
let (o,t) = makeUC()
のようにインスタンス化したいが私はそれを望んでいない - 私はそれを必要としない。 おそらく、F#で上位の種別の型が見つからない場合があります これには方法がありますか?以下@johnsコメントどおり
編集
実際に私の質問波平のcomplety。 はもちろん、私はその後、後方推論o
とt
はタイプSomeDU2<int,int> -> bool
であるようになり、次の
let ro1 = o ((One 1) : SomeDU2<int,int>)
let rt1 = t (Two (1,2))
行うことができます(私は非常に奇妙なあなたを推論後方これを見つけます)。問題は、o
がもうこれ以上許されないということです。
let ro2 = o ((One "1") : SomeDU2<string,int>)
だから私はSomeDU2
の一般的なパラメータの組み合わせ毎に特定o
のインスタンスをインスタンス化する必要があると思います。
つのオプション:一般的な方法で、公称タイプのエラーメッセージが言う何をするか、メッセージo' '使用した場合のいずれかは、おそらく離れて行きます –
@JohnPalmerが原因コメント – robkuz
にいくつかのより多くの情報を追加しましたどのように計画していますか?関数のタプルを使うのはどうですか?厄介なようだ。あなたは何を達成しようとしていますか? – asibahi