2016-06-07 2 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

Смежные вопросы