Как выполнить запрос к списку пользовательского типа с помощью карты и набора?

#haskell

Вопрос:

Я пытаюсь понять, как можно было бы использовать map и set для создания списка на основе пользовательского типа.

Например, «обзор типов», который состоит из: типа nameOfReviewer = Строка, типа nameOfTool = Строка, типа numberOfStars = Int.

Как бы я получил список имен людей, которые оставили отзыв, чтобы он соответствовал этому определению.

Я пробовал использовать Set.union, но мне не повезло.

 module Reviews where  import Data.Set (Set) import qualified Data.Set as Set import Data.Map (Map) import qualified Data.Map as Map type nameOfReviewer = String type nameOfTool = String type numberOfStars = Int  type Review = (nameOfReviewer, nameOfTool, numberOfStars)  -- list of people that have left a review. reviewers :: [Review] -gt; [nameOfReviewer] reviewers rl = ???  

Комментарии:

1. Вы не можете начать работать reviewers до тех пор, пока не получите определения типов до того, как он начнет компиляцию.

2. На самом деле вы не написали никаких пользовательских типов. Вы только что написали синонимы типов . Названия синонимов типов, а также типов данных и новых типов должны начинаться с заглавных букв.

3. голосование за закрытие. нужны детали или ясность

Ответ №1:

Чтобы написать пользовательский тип, вам нужно использовать data newtype ключевое слово or. newtype предназначен только для типов с одним конструктором и одним полем, поэтому мы будем использовать data .

 data Review = Review  { nameOfReviewer :: String  , nameOfTool :: String  , numberOfStars :: Int  }  

Должно ли количество звезд действительно быть любым Int ? Ну, вероятно, нет, потому что, скорее всего, это должно быть от 1 до 5, или от 0 до 10, или что-то в этом роде. Так что этот заслуживает своего собственного типа.

 newtype Stars = Stars Int  mkStars :: Int -gt; Maybe Stars mkStars n  | 1 lt;= n amp;amp; n lt;= 5  = Just (Stars n)  | otherwise  = Nothing  getStars :: Stars -gt; Int getStars (Stars stars) = stars  data Review = Review  { nameOfReviewer :: String  , nameOfTool :: String  , numberOfStars :: Stars  }  

Поскольку Stars это полноценный тип, вы можете экспортировать его абстрактно, заставляя пользователей использовать mkStars его и getStars взаимодействовать с ним, тем самым сохраняя правила звездного числа.