簡體   English   中英

f#函數返回泛型函數

[英]f# function that returns a generic function

我想做以下事情:

module private repo =
    let SaveEvts<'T> (conn:IConnection) mydata =  
        async {
            let! result = conn.SaveAsync(mydata)
        }

let SaveAsync (conn:IConnection) = repo.SaveEvts conn

所以我可以打開一個連接到我的數據庫,然后在我想要保存某些類型的T數據時關閉我的連接。 例如:

type Foo = { idPhoto : Guid }
type Bar = { reason : string }

let myConnection = new Connection(connectionString)
let save = SaveAsync myConnection
let doProgram =
    save<Foo>({idPhoto = 212313})
    save<Bar>({idPhoto = 212313})

這是幻想寫作,我不知道它是否編譯:我的問題在這里

  1. 有沒有辦法做我想要實現的東西,即返回泛型函數的普通函數。
  2. 如果它可行,是否可取?

我想避免寫作:

let saveFoo = SaveEvts<Foo> (conn:IConnection) 
let saveBar = SaveEvts<Bar> (conn:IConnection) 

但也許別無他法......

你不能編寫一個在F#中返回泛型函數的函數。 有兩種方法可以解決這個問題:

  • 您可以編寫一個函數,該函數使用泛型方法返回一個簡單對象,然后使用此對象完成所有工作
  • 您可以定義捕獲現有連接的新通用函數

因此,第二個代碼段中的代碼不起作用,但您可以這樣做:

let myConnection = new Connection(connectionString)
let save arg = SaveAsync myConnection arg

save {FooProperty = 212313}
save {BarProperty = 212313}

這里, save被定義為一個函數,因此它可以是通用的,但它仍然可以捕獲現有的已打開連接myConnection並將其用於您提供的所有不同參數。

暫無
暫無

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

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