如何使用映射和集合对自定义类型的列表执行查询



我正试图弄清楚如何使用map和set来生成基于自定义类型的列表。

例如"type Review",它包括:type nameOfReviewer=String,type nameOfTool=String,type 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] -> [nameOfReviewer]
reviewers rl = ???

要编写自定义类型,需要使用datanewtype关键字。newtype仅适用于具有单个构造函数和单个字段的类型,因此我们将使用data

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

恒星的数量真的应该是Int吗?嗯,可能不是,因为它可能必须在1到5之间,或者0到10之间,或者其他什么。因此,一个值得拥有自己的类型。

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

由于Stars是一个完整的类型,您可以抽象地导出它,迫使用户使用mkStarsgetStars与它进行交互,从而维护星形数规则。

最新更新