返回标题列表

时间:2016-12-01 03:09:37

标签: haskell

定义一个类型LibraryItem,表示库借给的项目 顾客:无论是期刊还是书本。期刊有目录号,标题和出版频率。出版频率可以是几天 或几个月。书籍有目录号, 标题和作者。只给出一本书或期刊,返回其标题和目录号。给出书籍和期刊列表,返回标题和目录号列表。

data Libraryitem = Book {cataloguenumber1 :: Int , title1 :: String , author :: String}| Periodical {cataloguenumber2 :: Int, title2 ::String , publicationfrequency :: Publicationfrequency} deriving (Show,Eq,Ord)
data Publicationfrequency = NumberofDays Int | NumberofMonths Int   deriving (Show,Eq,Ord)

如果在给出书籍/期刊详细信息时返回标题,则以下代码正在运行

titleR (Book _ titleR _ ) = titleR
titleR (Periodical _ titleR _ ) = titleR

我有两个问题,

1)使用我在定义数据类型时所做的title1赋值,还有其他方法可以返回单本书的标题和目录号吗?

2)如何使用递归并对项目列表执行此操作

我的递归尝试在

之下
titlen1 [] = []
titlen1 (x:xs) = if x == (Book  _ title1 _)
                 then title1 : title1 xs

虽然,我更喜欢使用我在定义中使用的title1。我也知道这段代码不足以执行任务。

1 个答案:

答案 0 :(得分:3)

您似乎误解了模式匹配的工作原理。检查here以获取有关模式匹配在Haskell中如何工作的更多信息。

  

1)还有其他方法可以返回标题和目录号   使用我在定义my时所做的title1任务的一本书   数据类型?

是的,你可以,但返回类型会有所不同。最简单的方法是返回一个元组。

titleR' :: LibraryItem -> (String, Int)
titleR' (Book catNumber titleR _) = (titleR, catNumber)
titleR' (Periodical catNumber titleR _) = (titleR, catNumber)
  

2)如何使用递归并对项目列表执行此操作?

以下是使用普通递归的解决方案。

titles :: [LibraryItem] -> [String]
titles [] = []
titles ((Book _ t _):xs) = t : titles xs
titles ((Periodical _ t _):xs) = t : titles xs

或者您可以使用地图功能(重复使用我们以前的titleR'功能)

titles :: [LibraryItem] -> [(String, Int)]
titles xs = map titleR' xs