2017-05-18 45 views
1

我現在要使用這些數據類型,但是我剛纔從其他編程語言中知道了什麼。 想象,「日期」得到的(年月日)數據聲明 - 使用3參數

當我有

data Month = Jan | Feb | Mar | Apr | May | Jun | Jul | Aug | Sep | Oct | Nov | Dec 
data Date = Date Int Month Int 

,我想有一個的Funktion

showDate :: Date -> String 

我怎麼能走3.參數從數據類型創建年份的日期? 或更好地描述..我如何創建一個字符串與返回爲例如「2017年5月18日」

其他語言我會寫日期[2]爲3參數或日期[0]爲1。

感謝您的幫助!

+0

'showDate(Date day month year)= <做一些日,月,年>'? – Lazersmoke

回答

4

你在Haskell做pattern matching

data Month = Jan | Feb | Mar | Apr | May | Jun | Jul | Aug | Sep | Oct | Nov | Dec deriving (Show) 
data Date = Date Int Month Int 

showData :: Date -> String 
showDate (Date day mon year) = "Date is: " ++ (show day) ++ " " ++ (show mon) ++ " " ++ (show year) 

注意,我得出Show實例Month型以上使用deriving (Show)。相反,自動做的,你可以給你的手工製作Show情況是這樣的:

instance Show Month where 
    show Jan = "January" 
    show Feb = "February" 
    .... and so on 

演示:

*Main> showDate (Date 3 Feb 2017) 
"Date is: 3 Feb 2017" 

甚至是這樣的:

data Month = Jan | Feb | Mar | Apr | May | Jun | Jul | Aug | Sep | Oct | Nov | Dec deriving (Show) 
data Date = Date Int Month Int deriving (Show) 

這將自動推導顯示您的數據類型的實例。

*Main> show (Date 3 Feb 2017) 
"Date 3 Feb 2017" 
+0

我知道模式構圖,但我真的嘗試了所有我知道的語法! 感謝您的幫助! –

+2

您應該使用模式匹配。模式匹配不是對語言的補充,而是它的核心部分。 – Nykros

+1

@ R.Mayer,如果你想知道,*沒有其他方式*,因爲你已經聲明瞭事情的方式。如果您定義了記錄字段的日期,例如'data Date = Date {day :: Int,month :: Month,year :: Int}',那麼你可以使用例如'year date'來提取年份。但是沒有這樣的定義,模式匹配是唯一的方法。 – luqui