2016-12-01 26 views
0

定義一個類型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,我在我的定義中使用。我也知道這個代碼不足以執行任務。

回答

3

看來你似乎誤解了模式匹配的工作原理。查詢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 

或者你可以使用地圖功能(重用我們以前titleR'功能)

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