2016-06-07 81 views
1

我在Haskell中創建了一個類型,但我不知道如何獲取我創建的類型的字段之一。我應該怎麼辦?我應該做一個功能Book -> String或類似的東西?Haskell - 類型的訪問字段

import Data.List 
import System.IO 


type Book = (Int, String, String, String, String, String, String) 



bookNew :: Int -> String -> String-> String -> String -> String -> String -> Book 
bookNew isbn title author genre date publisher summary = 
    (isbn,title,author,genre,date,publisher,summary):: Book 


main = do 
    let book = bookNew 1 "title" "author" "genre" "date" "publisher" "summary" 
    --Access title of "book" somehow 
    return book 

回答

9

我會建議在創建這樣一個大型的時候使用記錄。沿

data Book = Book { pages :: Int 
       , author :: String 
       , title :: String 
       } 

線的東西在這一點,如果你想一書的作者,這很簡單,只要

main = do 
    let book = Book 20 "me" "my book" 
    putStrLn (author book) 

這將打印您的書的作者。

記錄本質上是創建只從您的類型中提取單個數據的函數。

4

如果你想使用一種代名詞,那麼你必須手動創建功能檢索您Book類型的每一個「場」:

getTitle :: Book -> String 
getTitle (_, title, _, _, _, _, _) = title 

我會建議你創建一個使用自己的數據類型記錄語法以免費獲得此類功能。

此外,在創建此類複雜類型同義詞時,您可以創建其他同義詞來表示主同義詞的各個部分,以清楚說明Book代表的內容。

type Isbn = Int 
type Title = String 
type Author = String 
type Genre = String 
type Date = String 
type Publisher = String 
type Summary = String 

type Book = (Isbn, Title, Author, Genre, Date, Publisher, Summary) 

然後getTitle可以有型Book -> Title

+1

甚至比類型同義詞是使用'newtype'讓'Title','Author','Genre'等無法代替使用彼此。 – cdk