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