[英]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(按键排序)的键。 你有几个选择:
让Tags
使用支持结构比较的集合类型(例如不可变Tag list
)。
使用[<CustomComparison>]
代替[<StructuralComparison>]
,这需要实现IComparable
。
使用可变字典(或其他相关集合类型)而不是Map
。 例如,尝试使用dict
函数而不是Map.ofSeq
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.