F#允许签名的“.NET”和“OCaml”格式。当您习惯使用一种样式,然后发现无法正确格式化所需签名的情况时,这可能会造成混淆。考虑以下代码,它需要灵活的类型作为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

我不知道如何以OCaml格式表示#seq 。可能吗?

最佳答案

以下编译就可以了:

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

因此,您可以猜测(然后与F#Interactive确认)您在寻找#('a seq)

关于f# - 签名的“.NET”和“OCaml”格式,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/10957700/

10-09 09:29