Ric*_*ich 12 f# types type-inference
当我提出F#似乎不支持Infinite Types时,我正在Twitter上与Sadek Drobi聊天.事实证明,在C#中你可以沿着这些方向做点什么:
delegate RecDelegate<T> RecDelegate<T>(T x);
Run Code Online (Sandbox Code Playgroud)
然而,经过对我们两个部分的一些实验,我们确定F#中的相同内容似乎不可能是隐式和显式的.
明确:
type 'a specialF = 'a->specialF<'a>
Run Code Online (Sandbox Code Playgroud)
错误FS0191:此类型定义涉及通过缩写,结构字段或继承关系的立即循环引用.
隐式:
let rec specialF (x: 'a) = specialF
Run Code Online (Sandbox Code Playgroud)
类型不匹配.期待'b但是给'a - >'b.在统一''b'和'' - >'b'时,结果类型将是无限的.
当然,这些是故意简单的样品.
我想知道我是不是错了.也许我错过了某种必要的注释?
你也可以这样做
type 'a RecType = RecType of ('a -> 'a RecType)
Run Code Online (Sandbox Code Playgroud)
创建一个命名类型,通过它来执行递归.现在这个工作:
let rec specialF = RecType (fun _ -> specialF)
Run Code Online (Sandbox Code Playgroud)
type d<'T> = delegate of 'T -> d<'T> //'
let del : d<int> = null
let anotherDel = del.Invoke(1).Invoke(2).Invoke(3)
Run Code Online (Sandbox Code Playgroud)
我认为您需要一个可直接在CLI中表示的命名类型来中断递归,因此在F#中这意味着您还需要一个实际的委托类型.
| 归档时间: |
|
| 查看次数: |
1709 次 |
| 最近记录: |