F# 如何在不丢失原始类型的情况下接收扩展接口的类型

F# 如何在不丢失原始类型的情况下接收扩展接口的类型,f#,F#,我刚刚开始使用F#,我的大脑已经崩溃,试图找出如何处理它的类型,而不必求助于OO类型的编程 这里是我的情况,我基本上想要创建一个方法,在这里我提供类型和Id,它返回给我数据库中的对象 基本上这就是我目前得到的 let client = MongoClient() let database = client.GetDatabase("testdb") let lowerCase (str : string) = str.ToLower() let nameOf (classType:

我刚刚开始使用F#,我的大脑已经崩溃,试图找出如何处理它的类型,而不必求助于OO类型的编程

这里是我的情况,我基本上想要创建一个方法,在这里我提供类型和Id,它返回给我数据库中的对象

基本上这就是我目前得到的

let client = MongoClient()
let database = client.GetDatabase("testdb")

let lowerCase (str : string) = 
    str.ToLower()

let nameOf (classType: Type) = 
    classType.Name

let nameTypeOf<'a> = 
    nameOf typeof<'a>   

let getCollection<'a> =
    let collectionName = nameTypeOf<'a> |> lowerCase
    database.GetCollection<'a> collectionName

let dbSelect<'a> id = 
    let collection = getCollection<'a>
    collection.Find(fun(x) -> x.Id = id).First()
let client=MongoClient()
让database=client.GetDatabase(“testdb”)
让小写(str:string)=
托洛尔街()
让nameOf(classType:Type)=
classType.Name
让我们来谈谈
让getCollection |>小写
database.GetCollection id=

让collection=getCollection我认为这里的解决方案与C#中的解决方案没有太大区别。您可以约束泛型类型以使用接口成员,大致如下所示:

let getCollection<'a when 'a :> IDbObject> () =
   let collectionName = nameTypeOf<'a> |> lowerCase
   database.GetCollection<'a> collectionName

let dbSelect<'a when 'a :> IDbObject> id =
   let collection = getCollection<'a>()
   collection.Find(fun (x : 'a) -> x.Id = id).First()
让getCollection对象>()=
让collectionName=nameTypeOf collectionName
让dbs选择IDbObject>id=
让collection=getCollection x.Id=Id).First()

dbSelect
的类型应推断为
string->#IDbObject
,并在调用站点强制为
string->'a

您可以使用类型约束更好地指定
'a
需要的类型:不要把自己逼到角落,假设“普通的老”阶级在某种程度上是F#世界的第二公民。刚开始学习这门语言时,很容易产生这样的印象,但将自己局限于“本土F#类型”只是-限制你自己。@TeaDrivenDev这正是我遇到的问题,谢谢你的文档。@scrwtp我使用这个项目是为了强迫自己使用最少的OO,只是为了更习惯于功能性思维,尽管如此,您的反馈非常重要,我会在编程时考虑到这一点:)谢谢您花时间帮助我。@Destina不确定,祝您玩得开心。只是说,因为这是我经常看到的一种模式。哇,非常感谢。我不知道类型约束,这在我遵循的教程中被忽略了,这就是为什么我被卡住了。你刚刚救了我。
let getCollection<'a when 'a :> IDbObject> () =
   let collectionName = nameTypeOf<'a> |> lowerCase
   database.GetCollection<'a> collectionName

let dbSelect<'a when 'a :> IDbObject> id =
   let collection = getCollection<'a>()
   collection.Find(fun (x : 'a) -> x.Id = id).First()