簡體   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