開発環境
- macOS Sierra - Apple (OS)
- Emacs (Text Editor)
- Haskell (プログラミング言語)
- Haskell Platform(ghci)(処理系)
関数プログラミング入門(Richard Bird (著)、山下伸夫 (翻訳)、オーム社)の第2章(単純なデータ型)、2.1(ブール値)、練習問題2.1.1、2.1.2、2.1.3、2.1.4、2.1.5、2.1.6、2.1.7、2.1.8、2.1.9を取り組んでみる。
練習問題2.1.1、2.1.2、2.1.3、2.1.4、2.1.5、2.1.6、2.1.7、2.1.8、2.1.9
コード(Emacs)
-- 2.1.1 (&&), (||):: Bool -> Bool -> Bool x && y = if x then y else False x || y = if x then True else y -- 2.1.2 (⇨) :: Bool -> Bool -> Bool x ⇨ y = if x Main.&& (not y) then False else True -- 2.1.3 class Eq a where (==), (/=) :: a -> a -> Bool x /= y = not (x Main.== y) instance Main.Eq Bool where x == y = (x Main.&& y) Main.|| (not x Main.&& not y) -- 2.1.4 data Triangle = Failure | Isosceles | Equilateral | Scalene analyse :: (Integer, Integer, Integer) -> Triangle analyse (x, y, z) | (x <= y) Main.&& (y <= z) = f (x, y, z) | (x <= z) Main.&& (z <= y) = f (x, z, y) | (y <= x) Main.&& (x <= z) = f (y, x, z) | (y <= z) Main.&& (z <= x) = f (y, z, x) | (z <= x) Main.&& (x <= y) = f (z, x, y) | (z <= y) Main.&& (y <= x) = f (z, y, x) where f :: (Integer, Integer, Integer) -> Triangle f (x, y, z) | (x + y) <= z = Failure | x Prelude.== z = Equilateral | (x Prelude.== y) Main.|| (y Prelude.== z) = Isosceles | otherwise = Scalene -- 2.1.5 sort3 :: (Integer, Integer, Integer) -> (Integer, Integer, Integer) sort3 (x, y, z) | (x <= y) Main.&& (y <= z) = (x, y, z) | (x <= z) Main.&& (z <= y) = (x, z, y) | (y <= x) Main.&& (x <= z) = (y, x, z) | (y <= z) Main.&& (z <= x) = (y, z, x) | (z <= x) Main.&& (x <= y) = (z, x, y) | (z <= y) Main.&& (y <= x) = (z, y, x) analyse' :: (Integer, Integer, Integer) -> Triangle analyse' (x, y, z) | (x' + y') <= z' = Failure | x' Prelude.== z' = Equilateral | (x' Prelude.== y') Main.|| (y' Prelude.== z') = Isosceles | otherwise = Scalene where (x', y', z') = sort3 (x, y, z) -- 2.1.6 instance Prelude.Eq Triangle where Failure == Failure = True Isosceles == Isosceles = True Equilateral == Equilateral = True Scalene == Scalene = True instance Ord Triangle where Failure <= Isosceles = True Failure <= Equilateral = True Failure <= Scalene = True Isosceles <= Equilateral = True Isosceles <= Scalene = True Equilateral <= Scalene = True _ <= _ = False -- 2.1.7 複素数は通常の意味での大小の比較の意味はない -- 2.1.8 評価結果がBool値であること
入出力結果(Terminal, ghci)
$ ghci sample1.hs GHCi, version 8.0.2: http://www.haskell.org/ghc/ :? for help [1 of 1] Compiling Main ( sample1.hs, interpreted ) Ok, modules loaded: Main. *Main> True Main.&& True True *Main> True Main.&& False False *Main> True Main.|| False True *Main> False Main.|| False False *Main> False Main.|| True True *Main> True ⇨ False False *Main> True ⇨ True True *Main> False ⇨ True True *Main> False ⇨ False True *Main> True Main.== True True *Main> True Main./= True False *Main> analyse (3, 1, 2) <interactive>:18:1: error: • No instance for (Show Triangle) arising from a use of ‘print’ • In a stmt of an interactive GHCi command: print it *Main> analyse (3, 1, 2) == Failure <interactive>:19:19: error: Ambiguous occurrence ‘==’ It could refer to either ‘Prelude.==’, imported from ‘Prelude’ at sample1.hs:1:1 (and originally defined in ‘GHC.Classes’) or ‘Main.==’, defined at sample1.hs:14:3 *Main> analyse (3, 1, 2) Prelude.== Failure True *Main> analyse (2, 1, 2) Prelude.== Isosceles True *Main> analyse' (2, 1, 2) Prelude.== Isosceles True *Main> Failure <= Isosceles True *Main> Isosceles <= Failure False *Main> :q Leaving GHCi. $
0 コメント:
コメントを投稿