2011-09-26 59 views
-1

有幾種數據類型。進行函數返回的數據結構的標題

data Book =BName| Author deriving (Eq,Show) 
data Video = VName deriving (Eq,Show) 
data CD =Cname | Auth | NOC deriving (Eq,Show) 
data Product = Product Book Video CD deriving (Eq,Show) 

使函數getTitle返回結構的名稱(BName,CName或VName)。 例如 的getTitle(圖書「姓名 「NONAME」) - > 「名稱」 的getTitle(參見 「名稱」) - > 「名稱」 等

是否有可能

存在的數據類型?書字段標題和作者,Videocassete與現場作者,CDdisk與字段標題,組合物和作者的數量。 1)創建數據類型產品,其可以引入本數據類型 2)使函數的getTitle返回標題。 3)使函數getTitles返回產品列表中的所有標題(使用函數getTtitle) 4)使函數bookAuthors retu RN書中的產品 5)使功能lookupTitle ::字符串列表作者 - > [產品] - >也許產品返回產品,輸入名稱 6)使功能lookupTitles :: [字符串] - > [產品] - > [產品]哪些輸入參數是名稱和產品列表以及產品列表中每個產品的名稱。在第一個列表中忽略第二個列表中沒有產品的名稱。使用函數lookipTitle。

這一切的任務。


data Book = Book String String deriving(Eq,Show) 
data Video = Video String deriving(Eq,Show) 
data CDisk = CDisk String String Int deriving(Eq,Show) 
--titles 
class Titleable a where 
getTitle :: a ->String 
instance Titleable Book where 
getTitle (Book title _) = title 
instance Titleable Video where 
getTitle (Video title) = title 
instance Titleable CDisk where 
getTitle(CDisk title _ _) = title 
--get titles 
getTitles (x:xs) = [ getTitle x | x<-xs ] 
lookupTitle _ [] =Nothing 
lookupTitle::String->[Product]->Maybe Product 
lookupTitle a (x:xs) | getTitle x==a =Just x 
          | otherwise = lookupTitle a (x:xs) 
lookupTitles::[String]->[Product]->[Product] 
lookupTitles (x:xs) (y:ys) = [y|x<-xs,y<-ys,x==lookupTitle y] 

但 1)我不知道如何使功能bookAuthors(如何發揮作用找到這個參數是書本型?) 2)如何使產品類型?我的意思是是Book或Video或CDisk 3)lookupTitle和lookupTitle是否正確?

+3

你的問題沒有意義。例如,「Book」name「」noname「」甚至不是一個有效的表達式。 – Ingo

回答

11

你確定你想要的數據類型也是這樣嗎?

data Book = BName | Author deriving (Eq,Show) 

指一本書是BName(書名?)還是一個作者?

我懷疑你想類似

data Book = Book BName Author 

例如東西一本書有一本書的名字和作者

如果你想要捕捉的「titleable」的東西,你可以使用類型的類本質。

class Titleable a where 
    getTitle :: a -> String 

instance Titleable Book where 
    getTitle (Book title _) = title 

併爲您的其他類型編寫實例。

+0

代碼 'code' data Book = Book BName Author data Video = Video Tit Data CDisk = Cname Auth Noc data Product = Book |視頻| CDisk派生(Eq,Show) 'code' errro - undefined type constructot Noc –

+0

您需要定義什麼是「Noc」 –

+0

但它是CDisk上的組合數。我如何定義它? 它是CDisk的一個領域。 –

0

從任務的描述,這聽起來像他們正在尋找的數據類型是這樣的:

type Title = String 
type Author = String 

data Product = Book Title Author 
      | Video Title 
      | CD Title Integer Author 
      deriving (Eq, Show) 

功能getTitle然後可以使用模式匹配來實現。

getTitle (Book title _) = title 
getTitle (Video title) = title 
getTitle (CD title _ _) = title 

我會將其餘功能的執行留給您。

+0

它。這裏'getTitle'的類型是'Product - > Title'。 'Book','Video'和'CD'是'Product'類型的_data構造函數,而不是它們自己的類型。 – hammar

+0

我已經明白了。 爲什麼對於這樣的代碼 'getTitles(x:xs)= [getTitle x | X <-xs]' 其中 '讓=書 「名稱」, 「TNAME」 令b =視頻 「角色」 令C = CD 「播放」 5 「RRR」 令g = [A,B,C ]' getTitles g return only [「role」,「play」] –

+0

這是因爲當你對模式'(x:xs)'匹配'[a,b,c]'時,你得到'x = a'和'xs = [b,c]'。你需要'getTitles xs = ...'來代替'xs'中的整個列表。 – hammar