2014-05-05 69 views
1

我有一個枚舉和一個函數來調用枚舉的下一個元素。Haskell function-next for enums

data Day = Mon | Tue | Wed | Thu | Fri | Sat | Sun 
next :: Day -> Day 
next Mon = Tue 
next Tue = Wed 
next Wed = Thu 
next Thu = Fri 
next Fri = Sat 
next Sat = Sun 
next Sun = Mon 

我試圖通過調用使用此:

> next Mon 

但是編譯器顯示錯誤:

<interactive>:35:1: 
    No instance for (Show Day) arising from a use of `print' 
    Possible fix: add an instance declaration for (Show Day) 
    In a stmt of an interactive GHCi command: print it 

我做錯了嗎?

+0

你的函數沒問題,但是你試圖打印結果,所以你應該在日期類型聲明結尾添加'deriving(Show)' – m09

+0

'data Day = Mon |星期二|星期三|星期四|星期五|星期六| Sun派生(Show)'應該解決這個問題。 – Sibi

回答

4

這是因爲GHCi不知道如何顯示數據類型。您可以通過添加一個deriving Show解決這個問題:

data Day = Mon | Tue | Wed | Thu | Fri | Sat | Sun deriving Show 
3

問題是,當你嘗試在ghci,它要展示的結果String。但它不知道如何將其轉換爲String

這可以通過固定:

data Day = Mon | Tue | Wed | Thu | Fri | Sat | Sun deriving (Show) 

或者如果你想手動補String

instance Show Day where 
    show Mon = "Monday" 
    show Tue = "Tuesday" 
    show Wed = "Wednesday" 
    -- and so on 
9

除了實現Show,如果實現Enum您可以簡化next使用功能succ

data Day = Mon | Tue | Wed | Thu | Fri | Sat | Sun deriving (Show, Enum) 

next :: Day -> Day 
next Sun = Mon 
next d = succ d 

可以使next一個更一般的使用Bounded這個環繞行爲:

next :: (Eq a, Enum a, Bounded a) => a -> a 
next e | e == maxBound = minBound 
     | otherwise = succ e 

data Day = Mon | Tue | Wed | Thu | Fri | Sat | Sun deriving (Eq, Show, Enum, Bounded) 
0

請注意,您可以簡化next可以讓哈斯克爾獲得EnumBounded實例爲您提供:

data Day = Mon | Tue | Wed | Thu | Fri | Sat | Sun 
    deriving (Bounded, Enum, Show) 

next :: Day -> Day 
next Sun = Mon 
next x = succ x