2017年2月21日火曜日

開発環境

関数プログラミング入門(Richard Bird (著)、山下伸夫 (翻訳)、オーム社)の第3章(数値)、3.5(例: 有理数)、練習問題3.5.1、3.5.2を取り組んでみる。

練習問題3.5.1、3.5.2

コード(Emacs)

-- 3.5.1
-- x1 / y1 = x2 / y2
-- (d1 * x1') / (d1 * y1') = (d2 * x2') / (d2 * y2')
-- (d1 * x1') * (d2 * y2') = (d2 * x2') * (d1 * y1')
-- x1' * y2' = x2' * y1'
-- y2' = m * y1'
-- y1' = n * y2'
-- y1' = y2'
-- x1' = x2'

-- x1' / y1' = x2' / y2'


-- 3.5.2
-- x = 10 * q + r (0 <= r < 10)
-- x = 10 * (q + 1) + (r - 10)
-- r < 5
-- x = 10 * q + r
-- y = q, z = r
-- r >= 5
-- x = 10 * (q + 1) + (r - 10)
-- y = q + 1, z = r - 10


reprint :: Integer -> (Integer, Integer)
reprint x = if r < 5
            then (q, r)
            else (q + 1, r - 10)
  where q = div x 10
        r = mod x 10
        
main :: IO ()
main = do
  print (reprint (-4))
  print (reprint (-5))
  print (reprint (-6))
  print (reprint 4)
  print (reprint 5)
  print (reprint 6)
  print (reprint (-100))
  print (reprint (-1))
  print (reprint 0)
  print (reprint 1)
  print (reprint 100)

入出力結果(Terminal, ghci, runghc)

$ runghc sample5.hs
(0,-4)
(0,-5)
(-1,4)
(0,4)
(1,-5)
(1,-4)
(-10,0)
(0,-1)
(0,0)
(0,1)
(10,0)
$

0 コメント:

コメントを投稿