[英]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.