#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
взаимодействовать с ним, тем самым сохраняя правила звездного числа.