3

F# では、".NET" および "OCaml" 形式の署名を使用できます。これは、1 つのスタイルを使用する習慣に陥り、必要な署名を適切にフォーマットできない状況に陥ると、混乱を招く可能性があります。foo への関数入力の出力として柔軟な型を必要とする次のコードを検討してください。

let foo n (bar: int -> #seq<'a>) =
    (fun () -> Vector.ofSeq (bar n))

let foobar n = Array.ofSeq([1..n])

let x = foo 10 foobar

#seq<'a> を OCaml 形式で表現する方法がわかりませんでした。出来ますか?

4

2 に答える 2

4

以下は問題なくコンパイルされます。

type A<'a>(x) =
    member __.Get : 'a = x
    abstract PairWith : 'b -> ('a * 'b * int)
    default __.PairWith y = x, y, 1

type B<'a>(x) =
    inherit A<'a>(x)
    override __.PairWith y = x, y, 2

let pairAB (x : #A<'a>) y =
    x, x.PairWith y

type 'a X (x) =
    member __.Get : 'a = x
    abstract PairWith : 'b -> ('a * 'b * int)
    default __.PairWith y = x, y, 1

type 'a Y (x) =
    inherit X<'a>(x)
    override __.PairWith y = x, y, 2

let pairXY (x : #('a X)) y =
    x, x.PairWith y

したがって、探している#('a seq).

于 2012-06-09T07:00:08.010 に答える
1

私はあなたが何を意味するのか正確にはわかりませんが、型変数を型名の前に置きたいと思います'a #seq.

言語仕様 (§5.1.5) によると、次の理由から不可能です。

フォームの#type型は、サブタイプの制約を持つ匿名型であり、 と同等です。'a when 'a :> typeここ'aで、 は新しい型推論変数です。

したがって、タイプを次のように書くことができます'a when 'a :> seq<'b>

編集:実際に を使用することもできます#('a seq)が、見栄えが悪く、あなたが望むものではないかと思います。

EDIT2:Ramon Snirの答えを見ませんでした:)。

于 2012-06-09T06:24:54.320 に答える