2

這是當前代碼我要顯示的信息的數據庫的價值,但在打印了這一點,當它是不是很清楚閱讀..哈斯克爾 - 格式問題

type Title = String 
type Cast = String 
type Year = Int 
type Fans = String 

type Film = (Title, [Cast], Year, [Fans]) 
type Database = [Film] 

testDatabase :: Database 
testDatabase = [("Casino Royale", ["Daniel Craig", "Eva Green", "Judi Dench"], 2006, ["Garry", "Dave", "Zoe", "Kevin", "Emma"]), 
    ("Cowboys & Aliens", ["Harrison Ford", "Daniel Craig", "Olivia Wilde"], 2011, ["Bill", "Jo", "Garry", "Kevin", "Olga", "Liz"]),  
     ("Catch Me If You Can", ["Leonardo DiCaprio", "Tom Hanks"], 2002, ["Zoe", "Heidi", "Jo", "Emma", "Liz", "Sam", "Olga", "Kevin", "Tim"])]  

運行此功能時:

displayAllFilms :: Database ->[(Title, [Cast], Year, [Fans])] 
displayAllFilms [] = [] 
displayAllFilms ((i, j, k, l): xs) 
     |l == [] = (i, j, k, []) : displayAllFilms xs 
     |otherwise = (i, j, k, l) : displayAllFilms xs 

它打印此:

[( 「皇家賭場」,[ 「丹尼爾·克雷格」, 「伊娃·格林」, 「朱迪·丹奇」],2006年[ 「加里」, 「戴維」,「佐伊「,」Kevin「,」Emma「]),(」Cowboys & Aliens「,[」H arrison Ford「,」Daniel Craig「,」Olivia Wilde「,2011,[」Bill「,」Jo「,」Garry「,」Kevin「,」Olga「,」Liz「]),(」 Can「,[」Leonardo DiCaprio「,」Tom Hanks「],2002,[」Zoe「,」Heidi「,」Jo「,」Emma「,」Liz「,」Sam「,」Olga「,」Kevin「 「Tim」])]

這顯然是不可讀的:有沒有辦法讓每部電影信息(在這種情況下)都印在單獨的行上,即。利用/ n符號?

幫助將非常感謝,提前致謝! :)

回答

5
displayAllFilms :: Database -> IO() 
displayAllFilms db = mapM_ print db 

這是如何工作的?

  • print被定義爲

    print :: Show a => a -> IO() 
    print x = putStrLn (show x) 
    
  • 如何解釋mapM_?...你知道什麼map呢,是嗎?給定一個函數和一個列表,它將函數應用到列表中的每個元素,並返回結果列表。

    map需要a -> b類型的功能,但mapM_需要函數a -> IO b(我正在簡化)。 IO意味着函數可能執行一些I/O(在這種情況下:寫入屏幕,這就是print所做的)。

    mapM_將所有這些單獨的I/O塊連接在一起,並確保它們按正確的順序發生。

注:

  • 你原來displayAllFilms實際上並沒有做任何事情:輸出是一樣的輸入,什麼都被打印到屏幕上的唯一原因是,你正在運行它從ghci的提示符
  • 它(雖然我不使用它明確,因爲print/putStrLn在結束時自動添加一個換行符)拼寫\n,不/n
+0

感謝您的幫助,澄清,這部分代碼做什麼?: displayAllFilms db = mapM_ print db – user2240649 2013-04-04 12:54:23

+0

@ user2240649請參閱編輯。 – dave4420 2013-04-04 13:05:45