繁体   English   中英

F# - > Seq to Map

[英]F# -> Seq to Map

我正在尝试从数据库加载我的所有Categories ,然后将它们映射到Map (字典?),但是当我使用以下代码时:

[<StructuralComparison>]
type Category = { 
    mutable Id: string; 
    Name: string; 
    SavePath: string;
    Tags: ResizeArray<Tag> }

let categories = session.Query<Category>() 
                    |> Seq.map(fun z -> (z,0)) 
                    |> Map.ofSeq

它只是抛出一个错误,说:

struct,record或union类型'Category'具有'StructuralComparison'属性,但组件类型'ResizeArray'不满足'comparison'约束

我完全不知道该怎么做,所以任何帮助表示赞赏!

这里的问题是,通过将StructuralComparison属性添加到Category您已经要求F#在比较Category实例时使用结构比较。 简而言之,它将逐个比较每个成员,看它们是否相等,以确定两个Category实例是否相等。

这对Category每个成员施加了一个隐含约束,使其具有可比性。 ResizeArray<Tag>类型正在生成错误,因为它不具有可比性。 大多数集合类型都是如此。

为了消除此错误,您需要使ResizeArray<T>类型可比,或者为Map选择不同的键。 Don有一篇很棒的博客文章,深入探讨了这一主题,并提供了许多不同的方法来实现这一目标。 这非常值得一读

F#正在抱怨ResizeArray<_>不支持结构比较。 ResizeArray<_>实例是可变的,不支持结构比较,因此您不能将它们用作记录字段,这些字段用作Map<_,_> s(按键排序)的键。 你有几个选择:

  1. Tags使用支持结构比较的集合类型(例如不可变Tag list )。

  2. 使用[<CustomComparison>]代替[<StructuralComparison>] ,这需要实现IComparable

  3. 使用可变字典(或其他相关集合类型)而不是Map 例如,尝试使用dict函数而不是Map.ofSeq

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM