【问题标题】:Returning the list of titles返回标题列表
【发布时间】:2017-09-28 06:59:14
【问题描述】:

定义一个类型 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。我也知道此代码不足以执行任务。

【问题讨论】:

    标签: haskell


    【解决方案1】:

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

    1) 有没有其他方法可以返回标题和目录号 使用我在定义我的 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
    

    或者你可以使用map函数(复用我们之前的titleR'函数)

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-11-04
      • 1970-01-01
      • 2016-01-10
      • 1970-01-01
      • 1970-01-01
      • 2021-01-20
      • 1970-01-01
      相关资源
      最近更新 更多