Jim*_*ger 9 generics f# pipelining
在F#中,给出以下类:
type Foo() =
member this.Bar<'t> (arg0:string) = ignore()
Run Code Online (Sandbox Code Playgroud)
为什么以下编译:
let f = new Foo()
f.Bar<Int32> "string"
Run Code Online (Sandbox Code Playgroud)
虽然以下内容不会编译:
let f = new Foo()
"string" |> f.Bar<Int32> //The compiler returns the error: "Unexpected type application"
Run Code Online (Sandbox Code Playgroud)
Tom*_*cek 14
看起来不支持在将方法视为第一类值时提供类型参数.我检查了F#规范,这里有一些重要的部分:
14.2.2项目限定查找
[如果应用程序表达式以:]开头
<types>expr,然后<types>用作类型参数和expr表达式参数.- expr,然后使用expr作为表达式参数.
- 否则不使用表达式参数或类型参数.
- 如果[method]标有
RequiresExplicitTypeArguments属性,则必须给出显式类型参数.
如果指定类型参数和参数,则第一种情况适用,但正如您所看到的,规范也需要一些实际参数.不过,我不太清楚这背后的动机是什么.
无论如何,如果你在成员的类型签名中的任何地方使用type参数,那么你可以使用类型注释来指定它,如下所示:
type Foo() =
member this.Bar<´T> (arg0:string) : ´T =
Unchecked.defaultof<´T>
let f = new Foo()
"string" |> (f.Bar : _ -> Int32)
Run Code Online (Sandbox Code Playgroud)
另一方面,如果您不在签名中的任何位置使用类型参数,那么我不太清楚为什么您首先需要它.如果只是为了某些运行时处理而需要它,那么您可以将运行时类型表示作为参数:
type Foo() =
member this.Bar (t:Type) (arg0:string) = ()
let f = new Foo()
"string" |> f.Bar typeof<Int32>
Run Code Online (Sandbox Code Playgroud)