計算機科学のブログ

実践Haskell HaskellのエラーとEither型 head関数と部分関数 maximum関数、succ関数、sum関数、失敗する入力

入門Haskellプログラミング (Will Kurt(著)、株式会社クイープ(監修、翻訳)、翔泳社)のUNIT7(実践Haskell)、LESSON 38(HaskellのエラーとEither型)、38.1(head関数、部分関数、エラー)のクイックチェック 38-1、head関数と部分関数のクイックチェック 38-2の解答を求めてみる。

クイックチェック 38-2のsum関数について、無限リスト、[1..]とかを入力にすると、ghciでエラーメッセージは表示されないけど計算g他終わらずメモリーがどんどん使い尽くされていく。

コード

-- クイックチェック 38-1
myTakePM :: Int -> [a] -> [a]
myTakePM 0 _ = []
myTakePM _ [] = []
myTakePM n (x:xs) = x:myTakePM (n - 1) xs


main :: IO ()
main = do
    putStrLn "クイックチェック 38-1"
    print (myTakePM 10 [] :: [Int])
    print (myTakePM 0 [] :: [Int])
    print (myTakePM 5 [1..10] :: [Int])

入出力結果(Terminal, Zsh)

% runghc sample01.hs 
クイックチェック 38-1
[]
[]
[1,2,3,4,5]
 % ghci
GHCi, version 8.10.7: https://www.haskell.org/ghc/  :? for help
Loaded package environment from /Users/kamimura/.ghc/x86_64-darwin-8.10.7/environments/default
macro 'doc' overwrites builtin command.  Use ':def!' to overwrite.
(0.00 secs, 0 bytes)
(0.00 secs, 0 bytes)
Loaded GHCi configuration from /Users/kamimura/.ghc/ghci.conf
Prelude
λ> :t maximum
maximum :: (Foldable t, Ord a) => t a -> a
Prelude
λ> maximum [5, 1, 4, 2, 3]
5
it :: (Ord a, Num a) => a
(0.01 secs, 63,216 bytes)
Prelude
λ> maximum []
*** Exception: Prelude.maximum: empty list
Prelude
λ> :t succ
succ :: Enum a => a -> a
Prelude
λ> succ 10
11
it :: (Enum a, Num a) => a
(0.01 secs, 61,136 bytes)
Prelude
λ> succ maxBound :: Int
*** Exception: Prelude.Enum.succ{Int}: tried to take `succ' of maxBound
Prelude
λ> :quit
Leaving GHCi.
%