簡體   English   中英

如何在F#中定義具有不同簽名的函數數組

[英]How to define an array of functions of different signature in F#

我希望能夠沿着這條線使用一系列函數:

type SomeFunc =
| StringFunc  of (int -> string)
| DecimalFunc of (int -> decimal)

let dataCols = Dict<string, SomeFunc>()
dataCols["A"] <- fun x -> sprintf "%d" x
dataCols["B"] <- fun x -> decimal x

// would want to have:
(dataCols["A"] 0) // "0"
(dataCols["B"] 0) // 0M

如何用有效的F#代碼表達這個想法?

第一件事是,將函數放入字典時,需要將它們包裝在StringFuncDecimalFunc

let dataCols = Dictionary<string, SomeFunc>()
dataCols["A"] <- StringFunc(fun x -> sprintf "%d" x)
dataCols["B"] <- DecimalFunc(fun x -> decimal x)

當您要調用該函數時,需要分別處理這兩種情況。 這里的一個問題是您的兩個函數返回不同的結果。 您實際上不能直接直接執行此操作,因此在調用該函數時,您將必須返回一個裝箱的obj ,或者您必須定義一個新的已區分字符串(字符串或十進制)。 第一個選項如下所示:

let call func arg = 
  match func with
  | StringFunc f -> box (f arg)
  | DecimalFunc f -> box (f arg)

然后,您可以使用call助手:

call (dataCols["A"]) 0
call (dataCols["B"]) 0

拳擊意味着您將獲得obj ,但是很難說出在不了解您的具體情況的情況下處理此問題的最佳方法是什么。

從您的代碼中,我得到的印象是,輸入類型將始終是相同的(在示例中為int),以便能夠在不知道其類型的情況下調用任何列。

如果是這樣,則可能要對返回類型而不是函數類型使用DU。 這樣,您將獲得所需的呼叫行為。

type ColumnValue =
| StringValue of string
| DecimalValue of decimal

let dataCols = Dictionary<string, (int -> ColumnValue)>()
dataCols.["A"] <- fun x -> StringValue (sprintf "%d" x)
dataCols.["B"] <- fun x -> DecimalValue (decimal x)

// what you get
dataCols.["A"] 0 // (StringValue "0")

match (dataCols.["A"] 0) with
| StringValue s -> printf "%s" s
| DecimalValue d -> printf "%M" d

暫無
暫無

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

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