在下面的代碼中,我想使用變量的類型實例化一個模板類,最終作爲傳遞給函數的泛型變量,但即使這個更簡單的形式也不起作用:在F#模板中使用編譯時可派生類型
type saveXY<'a when 'a:comparison> (x:'a,y:'a) =
member this.X = x
member this.Y = y
member this.lessThan() = this.X < this.Y
[<EntryPoint>]
let main argv =
let x1 = 3
let y1 = 7
let saver1 = new saveXY<int>(x1,y1) // Good
printfn "%A" (saver1.lessThan())
let x2 = 3.0
let y2 = 7.0
let saver2 = new saveXY<float>(x2,y2) // Good
printfn "%A" (saver2.lessThan())
let saver3 = new saveXY<x2.GetType()> (x2,y2) // No Good, see errors
0
然而,對於saver3
下面我獲得(和我不能找到FS1241信息):
...\Program.fs(23,39): error FS0010: Unexpected symbol '(' in type arguments. Expected ',' or other token.
...\CompareProblem\Program.fs(23,39): error FS1241: Expected type argument or static argument
如果去除saveXY
模板,然後saver2
是錯誤的,因爲saver1
導致saveXY
類參數被限制爲整數。
我還嘗試將x和y聲明爲obj
,但這不起作用。我懷疑問題在於,這只是這不可能, 也就是說,如果類參數類型是通用類型的,那麼它們從第一次使用開始就會派生一次。另一方面,也許我錯過了一些東西。
有沒有辦法使用基於變量的類型,這可以在編譯時確定爲F#中的類型模板參數?是否有另一種方法來創建一個能夠處理/存儲通用值的類型?
UPDATE:從李先生的建議,這個工作,如果模板類,然後只用<_>
初始化它會工作:
type saveXY<'a when 'a:comparison> (x:'a, y:'a) =
member this.X = x
member this.Y = y
member this.lessThan() = this.X < this.Y
[<EntryPoint>]
let main argv =
let x1 = 3
let y1 = 7
let saver3 = new saveXY<_> (x1,y1) // works, 'a is int
printfn "%A" (saver3.lessThan())
let x2 = 3.0
let y2 = 7.0
let saver3 = new saveXY<_> (x2,y2) // works, 'a is float
printfn "%A" (saver3.lessThan())
System.Console.ReadKey() |> ignore // wait for a key
0
但爲什麼我需要模板類的類型,如我上面建議?這似乎是編譯器反正演繹的類型,當我使用<_>
那麼爲什麼我不能簡單地使用(因爲我會爲一個函數):
type saveXY(x, y) = // x and y are generic, no? They only require comparison, yes?
member this.X = x
member this.Y = y
member this.lessThan() = this.X < this.Y
[<EntryPoint>]
let main argv =
let x1 = 3
let y1 = 7
let saver3 = new saveXY (x1,y1) // works
printfn "%A" (saver3.lessThan())
let x2 = 3.0
let y2 = 7.0
let saver3 = new saveXY (x2,y2) // But this FAILS with error FS0001
printfn "%A" (saver3.lessThan())
System.Console.ReadKey() |> ignore // wait for a key
0
不,您不能像這樣指定類型參數,但您已經知道靜態類型'x2'和'y2',所以您的用例不清楚。 – Lee
不是很清楚你到底想要做什麼:你是在試圖構建一些代碼來實例化你的類,這個類的泛型參數是_is在編譯時不知道的,或者你只是想說「_whatever type'x2',請使用that_「,並讓編譯器找出它? –
它的:_simply想說「任何類型的x2,請使用它」,並讓編譯器找出它?_ case - 在上面的例子中,我想'saver3'用float模板類型實例化,因爲'x2'是一個浮點數。在實際的代碼中,x2將是泛型類型的函數參數,但函數實例化的地方是不同的編譯時類型 – user1857742