gpt4 book ai didi

generics - F# 编译错误 : Unexpected type application

转载 作者:行者123 更新时间:2023-12-04 08:54:33 24 4
gpt4 key购买 nike

在 F# 中,给定以下类:

type Foo() =
member this.Bar<'t> (arg0:string) = ignore()

为什么编译如下:
let f = new Foo()
f.Bar<Int32> "string"

虽然以下不会编译:
let f = new Foo()
"string" |> f.Bar<Int32> //The compiler returns the error: "Unexpected type application"

最佳答案

看起来不支持在将方法视为第一类值时提供类型参数。我查了 F# specification这里有一些重要的部分:

14.2.2 Item-Qualified Lookup
[If the application expression begins with:]

  • <types> expr, then use <types> as the type arguments and expr as the expression argument.
  • expr, then use expr as the expression argument.
  • otherwise use no expression argument or type arguments.
  • If the [method] is labelled with the RequiresExplicitTypeArguments attribute then explicit type arguments must have been given.


如果您指定类型参数和参数,则第一种情况适用,但正如您所见,规范也需要一些实际参数。不过,我不太确定这背后的动机是什么。

无论如何,如果您在成员的类型签名中的任何位置使用类型参数,那么您可以使用这样的类型注释来指定它:
type Foo() = 
member this.Bar<´T> (arg0:string) : ´T =
Unchecked.defaultof<´T>

let f = new Foo()
"string" |> (f.Bar : _ -> Int32)

另一方面,如果您不在签名中的任何地方使用类型参数,那么我不太确定您为什么首先需要它。如果您只需要它用于某些运行时处理,那么您可以将运行时类型表示作为参数:
type Foo() = 
member this.Bar (t:Type) (arg0:string) = ()

let f = new Foo()
"string" |> f.Bar typeof<Int32>

关于generics - F# 编译错误 : Unexpected type application,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41555336/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com