f#函数返回泛型函数

时间:2015-12-09 16:14:53

标签: generics f#

我想做以下事情:

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. 如果可行,是否可取?
  3. 我想避免写作:

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

    但也许没有别的办法......

1 个答案:

答案 0 :(得分:3)

您无法编写在F#中返回泛型函数的函数。有两种方法可以解决这个问题:

  • 您可以编写一个函数,该函数使用泛型方法返回一个简单对象,然后使用该对象完成所有工作
  • 您可以定义捕获现有连接的新通用功能

因此,您的第二个代码段中的代码无效,但您可以这样做:

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

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

这里,save被定义为一个函数,因此它可以是通用的,但它仍然可以捕获现有的已打开连接myConnection并将其用于您提供的所有不同参数。< / p>