F # -> Seq to Map - PullRequest
       27

F # -> Seq to Map

4 голосов
/ 04 апреля 2011

Я пытаюсь загрузить все свои 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

, это простовыдает ошибку, которая говорит:

Тип структуры, записи или объединения «Категория» имеет атрибут «StructuralComparison», но тип компонента «ResizeArray» не удовлетворяет ограничению «сравнение»

Я понятия не имею, что делать, поэтому любая помощь приветствуется!

Ответы [ 2 ]

5 голосов
/ 04 апреля 2011

F # справедливо жалуется, что ResizeArray<_> не поддерживает структурное сравнение. ResizeArray<_> экземпляры являются изменяемыми и не поддерживают структурное сравнение, и поэтому вы не можете использовать их в качестве полей записей, которые используются в качестве ключей для Map<_,_> s (которые отсортированы по ключу). У вас есть несколько вариантов:

  1. Пусть Tags использует тип коллекции, который поддерживает структурное сравнение (например, неизменный Tag list).

  2. Используйте [<CustomComparison>] вместо [<StructuralComparison>], что требует реализации IComparable.

  3. Используйте изменяемый словарь (или другой соответствующий тип коллекции) вместо Map. Попробуйте использовать функцию dict вместо Map.ofSeq, например.

5 голосов
/ 04 апреля 2011

Проблема здесь в том, что, добавив атрибут StructuralComparison к типу Category, вы попросили F # использовать структурное сравнение при сравнении экземпляров Category. Короче говоря, он будет сравнивать каждого члена в отдельности, чтобы увидеть, равны ли они, чтобы определить, равны ли два экземпляра Category.

Это накладывает неявное ограничение на каждого члена Category, чтобы они были сопоставимы. Тип ResizeArray<Tag> генерирует ошибку, потому что он не сопоставим. Это верно для большинства типов коллекций.

Чтобы избавиться от этой ошибки, вам нужно сделать тип ResizeArray<T> сопоставимым или выбрать другой ключ для Map. У Дона есть отличный пост в блоге, который углубленно углубляется в эту тему и предлагает несколько различных способов достижения этой цели. Это очень стоит прочитать

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...