在F#Interactive(fsi)中,您可以使用AddPrinter
或AddPrinterTransformer
为交互式会话中的类型提供漂亮的打印。如何为通用类型添加此类打印机?对该类型使用通配符_
不起作用:
> fsi.AddPrinter(fun (A : MyList<_>) -> A.ToString());;
不使用打印机。
输入一个类型参数也会发出警告:
> fsi.AddPrinter(fun (A : MyList<'T>) -> A.ToString());;
fsi.AddPrinter(fun (A : MyList<'T>) -> A.ToString());;
-------------------------------^^
d:\projects\stdin(70,51): warning FS0064: This construct causes code
to be less generic than indicated by the type annotations. The type
variable 'T been constrained to be type 'obj'.
这也不是我想要的。
答案 0 :(得分:7)
这对于一般情况不起作用,但是因为看起来你正在使用自己的类型(至少在你的例子中),并假设你不想影响ToString
,你可以做这样的事情:
type ITransformable =
abstract member BoxedValue : obj
type MyList<'T>(values: seq<'T>) =
interface ITransformable with
member x.BoxedValue = box values
fsi.AddPrintTransformer(fun (x:obj) ->
match x with
| :? ITransformable as t -> t.BoxedValue
| _ -> null)
输出:
> MyList([1;2;3])
val it : MyList<int> = [1; 2; 3]
对于第三方泛型类型,您可以使用AddPrintTransformer
和反射来获取要显示的值。如果你有源代码,界面会更容易。