簡體   English   中英

f# 為多種類型和重載運算符定義通用 function

[英]f# define generic function for multiple types and overloaded operators

我正在嘗試定義一個內聯 function 可以以通用方式對多種類型(包括用戶定義的類型)執行算術運算。 然而,似乎內聯 function 似乎過早地推斷出它的類型。

我的自定義類型如下:

type ^T Foo (x: ^T) =
    static member inline (*) (x: ^T, y: Foo< ^T>) = Foo x

這就是我想使用它的方式:

let foo = Foo 1

let F () = 1 * foo // works
let inline G x = 1 * x // G inferred as int -> int

let z1 = G 1 // works
let z2 = G foo // error: expected int not Foo

在保持簡單的同時編寫像 G 這樣的通用函數的最佳方法是什么?

問題是 F# 類型推斷在這里使用了弱分辨率:

let inline G x = 1 * x // G inferred as int -> int

也就是說,在存在二元運算符的情況下,它使用一個運算符是已知類型的證據來匹配具有相同類型的另一個運算符。

在存在 inline 關鍵字的未來版本中,此行為可能會發生變化。

目前,編寫 function 的標准方法是使用通用方法:

let inline G x = LanguagePrimitives.GenericOne * x

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM