6

这是一个纯粹的学术问题,但对这个 关于类型约束的问题提出了质疑。提问者举了一个例子:

type Something<'a, 'b when 'b :> seq<'b>>() =
    member __.x = 42

f# 愉快地编译。现在的问题是如何制作这个对象?

let z = new Something<???, ???>()
4

2 回答 2

4
type T() =
    interface seq<T> with
        member this.GetEnumerator() = ([] :> seq<T>).GetEnumerator()
        member this.GetEnumerator() = ([] :> seq<T>).GetEnumerator() :> System.Collections.IEnumerator

let z = new Something<string, T>()
于 2016-06-01T21:11:12.073 回答
3

这是一种方法:

open System.Collections.Generic

type Node<'a> () =
    let getEmptyEnumerator () = Seq.empty<Node<'a>>.GetEnumerator ()
    interface IEnumerable<Node<'a>> with
        member this.GetEnumerator () = getEmptyEnumerator ()
        member this.GetEnumerator () =
            getEmptyEnumerator () :> System.Collections.IEnumerator

您可以实现此类以返回一系列子节点,而不是返回空序列。我称这种类型为Node<'a>,因为它是在 C# 中对树(或图)建模的一种相当惯用的方式。

利用:

> let smth = Something<string, Node<int>> ();;    
val smth : Something<string,Node<int>>

> smth.x;;
val it : int = 42
于 2016-06-01T21:11:23.853 回答