相关疑难解决方法(0)

如何将对象强制转换为F#中的泛型类型列表

在下面的代码片段中,我的目的是将System.Object(可以是FSharpList)转换为它所持有的任何泛型类型的列表.

    match o with
    | :? list<_>              -> addChildList(o :?> list<_>)
    | _                       -> addChild(o)
Run Code Online (Sandbox Code Playgroud)

不幸的是,只有list<obj>匹配列表.我也想list<Foo>作为一个列表进行匹配.

对于某些上下文,我试图通过反射遍历对象结构,以便构建类及其子类的TreeView.考虑以下课程:

type Entity = {
    Transform   : Matrix
    Components  : obj list
    Children    : Entity list
}
Run Code Online (Sandbox Code Playgroud)

我想构建一个树,向我展示实体中包含的所有类.通过反射,我可以获得对象的所有属性及其值(值很重要,因为我想在列表中显示元素的Name属性,如果有的话):

        let o = propertyInfo.GetValue(obj, null)
Run Code Online (Sandbox Code Playgroud)

此值可能是某种类型的列表,但值返回只是一个System.Object我在尝试将此对象转换为列表时遇到问题.我被迫做以下事情:

        match o with
        | :? list<obj>              -> addChildList(o :?> list<obj>)
        | :? list<Entity>           -> addChildList(o :?> list<Entity>)
        | _                         -> addChild(o)
Run Code Online (Sandbox Code Playgroud)

在这里,我必须准确指定我要转换为的类型.
我真的想写这个:

        match o with
        | :? list<_>              -> addChildList(o :?> list<_>)
        | _                       -> …
Run Code Online (Sandbox Code Playgroud)

generics f# casting list

7
推荐指数
2
解决办法
3433
查看次数

使用'flexible'类型参数对泛型类型进行模式匹配

match value with
| :? list<#SomeType> as l -> l //Is it possible to match any list of a type derived from SomeType?
| _ -> failwith "doesn't match"
Run Code Online (Sandbox Code Playgroud)

f# pattern-matching

6
推荐指数
2
解决办法
2626
查看次数

在实现接口的非泛型方法中对泛型的模式匹配

我有一个令人沮丧的问题.我正在ASP.NET MVC中构建一个视图引擎,并正在实现接口IViewEngine.在其中一种方法中,我试图动态地找出视图结果的类型.有时结果是模板(类型为Template <'key>).密钥用于在模板中定位占位符,其目的是使用区分联合,可能对每个网站都是唯一的.它可能看起来像这样:

type MasterKey = | HeadContent | HeaderContent | MainContent | FooterContent
let MasterTemplate : Template<MasterKeys> = ...
Run Code Online (Sandbox Code Playgroud)

现在,问题是这样的:因为我正在实现一个接口,所以我无法控制方法签名.由于我无法添加泛型类型参数,因此'a'将转换为obj,而下面的模板将不匹配:

   match result with
   | :? foo -> ...
   | :? bar -> ...
   | :? Template<'a> -> ...
Run Code Online (Sandbox Code Playgroud)

有任何想法吗?

f# pattern-matching

2
推荐指数
1
解决办法
1325
查看次数

如何将对象列表转换为原始数据类型?

我有一个表示原始类型的区分工会:

type Expr = 
    | Int of bigint
    | Real of float
    | Symbol of string
    | Bool of bool
    | List of Expr list
Run Code Online (Sandbox Code Playgroud)

我正在编写一个函数list : obj list -> Expr list,该函数将检查对象的类型并将其相应地转换为Expr

let rec list : (obj list -> Expr list) = function
    | head::tail -> 
        match head with
        | :? string as x'-> Symbol (x') :: list tail
        | :? int as x'-> Int(bigint x') :: list tail
        | :? bigint as x' -> Int …
Run Code Online (Sandbox Code Playgroud)

f# list

2
推荐指数
1
解决办法
394
查看次数

标签 统计

f# ×4

list ×2

pattern-matching ×2

casting ×1

generics ×1