不可能使对象具有递归类型约束?
Impossible to make object with a recursive type constraint?
这是一个纯粹的学术问题,不过是抄袭
关于类型约束。提问者以此为例:
type Something<'a, 'b when 'b :> seq<'b>>() =
member __.x = 42
哪个 f# 编译愉快。现在的问题是你如何制作这个对象??
let z = new Something<???, ???>()
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>()
这是一种方法:
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
您可以将此 class 实现为 return 子节点序列,而不是 return 空序列。我称这种类型为 Node<'a>
,因为它是在 C# 中为树(或图)建模的一种相当惯用的方式。
使用:
> let smth = Something<string, Node<int>> ();;
val smth : Something<string,Node<int>>
> smth.x;;
val it : int = 42
这是一个纯粹的学术问题,不过是抄袭
type Something<'a, 'b when 'b :> seq<'b>>() =
member __.x = 42
哪个 f# 编译愉快。现在的问题是你如何制作这个对象??
let z = new Something<???, ???>()
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>()
这是一种方法:
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
您可以将此 class 实现为 return 子节点序列,而不是 return 空序列。我称这种类型为 Node<'a>
,因为它是在 C# 中为树(或图)建模的一种相当惯用的方式。
使用:
> let smth = Something<string, Node<int>> ();;
val smth : Something<string,Node<int>>
> smth.x;;
val it : int = 42