Ray*_*Ray 6 f# types type-constraints recursive-type
这是一个纯粹的学术问题,但是 关于类型约束的这个问题很难过.提问者以此为例:
type Something<'a, 'b when 'b :> seq<'b>>() =
member __.x = 42
Run Code Online (Sandbox Code Playgroud)
哪个f#开心地编译.现在的问题是你如何制作这个对象?
let z = new Something<???, ???>()
Run Code Online (Sandbox Code Playgroud)
这是一种方法:
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
Run Code Online (Sandbox Code Playgroud)
您可以实现此类以返回子节点序列,而不是返回空序列。我将这种类型称为 类型Node<'a>,因为这是在 C# 中对树(或图)进行建模的一种相当惯用的方法。
使用:
> let smth = Something<string, Node<int>> ();;
val smth : Something<string,Node<int>>
> smth.x;;
val it : int = 42
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
96 次 |
| 最近记录: |