計算機科学のブログ

型の紹介 型クラス Int型、Enum型クラス、Bounded型クラス、succ関数の独自実装、Eq型クラス

入門Haskellプログラミング (Will Kurt(著)、株式会社クイープ(監修、翻訳)、翔泳社)のUNIT2(型の紹介)、LESSON13(型クラス)、13.8(練習問題)Q13-3の解答を求めてみる。

コード

cycleSucc :: (Bounded a, Enum a, Eq a) => a -> a
cycleSucc n =
  if n == maxBound -- このためにEq型クラスが必要
    then minBound
    else succ n

n1 :: Int
n1 = 1

n2 :: Int
n2 = maxBound

main :: IO ()
main = do
  print $ cycleSucc n1
  print $ cycleSucc $ cycleSucc n1
  print $ succ n1
  print $ succ $ succ n1
  print $ cycleSucc n2
  print $ cycleSucc $ cycleSucc n2
  print $ succ n2

入出力結果(Terminal, Zsh)

% runghc sample3.hs
2
3
2
3
-9223372036854775808
-9223372036854775807
sample3.hs: Prelude.Enum.succ{Int}: tried to take `succ' of maxBound
%