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