【发布时间】:2018-07-25 13:51:03
【问题描述】:
(这个场景似乎没有被前一个线程回答,或者至少不是以我显而易见的方式,关键的区别是对高阶类型的递归要求)
(我已经重写了这个问题以给出一些可行的东西......但很痛苦......而不是围绕约束的模糊愿望)
我有一些代码有点像这样(但还有更多类型)...
type TypeOfOperator =
static member typeOf(i : TypeOf<int>) = 1
static member typeOf(i : TypeOf<string>) = 2
static member typeOf(i : TypeOf<seq<int>>) = 3 + TypeOfOperator.typeOf(TypeOf<int>())
static member typeOf(i : TypeOf<seq<string>>) = 3 + TypeOfOperator.typeOf(TypeOf<string>())
static member typeOf(i : TypeOf<option<int>>) = 4 + TypeOfOperator.typeOf(TypeOf<int>())
static member typeOf(i : TypeOf<option<string>>) = 4 + TypeOfOperator.typeOf(TypeOf<string>())
let x = TypeOfOperator.typeOf(TypeOf<int>())
let y = TypeOfOperator.typeOf(TypeOf<string>())
let z = TypeOfOperator.typeOf(TypeOf<seq<int>>())
let a = TypeOfOperator.typeOf(TypeOf<seq<string>>())
此代码有效!...对于原子类型(例如“int”),这种构造是非常固有的,但是高阶类型(例如 seq)的形成是公式化的...即一个常量“+”对参数类型的一些递归调用....但这似乎在 F# 中无法捕获,我不得不费力地手动实现代码。
理想情况下 option 的方法将/应该执行一次,例如....
static member typeOf<'a>(i : TypeOf<option<'a>>) = 4 + TypeOfOperator.typeOf(TypeOf<'a>())
即写过一次……但这显然不能编译。
f#中有没有办法实现上述方法/功能?
【问题讨论】:
-
它显然也不适用于外部定义的类型......所以如果我想做 TypeOf
......那么我无法将方法 ttype 静态附加到字符串。跨度> -
您能否发布一个您想要使用的语法示例以及您想要获得的结果?我不完全确定我理解您的预期功能应该做什么。
-
是的,一定给我一个小时
-
哦...那很好,我不认为你可以超载...让我上厕所
标签: f#