我有以下代码
module File1
let convert<'T> x = x
type myType () =
member this.first<'T> y =
convert<'T> y
member this.second<'T> ys =
ys
|> Seq.map this.first<'T>
在最后'T
我收到错误Unexpected type arguments
。例如,当我呼叫let x = myType.first<int> "34"
时,没有警告,一切都按预期工作。离开类型参数会消除警告,并且程序在某些时候会按预期运行。
有谁能解释这里发生了什么?
谢谢
答案 0 :(得分:4)
简而言之,您需要使用类型参数为您的方法提供显式参数。可以通过更改
来修复错误ys
|> Seq.map this.first<'T>
到
ys
|> Seq.map (fun y -> this.first<'T> y)
在this excellent answer中非常清楚地解释了错误,我在此不再重复。请注意,错误消息已在F#2.0和F#3.0之间更改。
您实际上并未在类型签名中的任何位置使用'T
,因此您只需删除'T
即可。
如果您需要查询类型,我建议在上面的Tomas回答中使用该技术。
type Foo() =
member this.Bar (t:Type) (arg0:string) = ()
let f = new Foo()
"string" |> f.Bar typeof<Int32>