2014年3月7日金曜日

開発環境

Real World Haskell―実戦で学ぶ関数型言語プログラミング(Bryan O'Sullivan (著)、 John Goerzen (著)、 Don Stewart (著)、山下 伸夫 (翻訳)、伊東 勝利 (翻訳)、株式会社タイムインターメディア (翻訳)、オライリージャパン)の12章(バーコード認識)、12.2(配列とは)、練習問題 3.を解いてみる。

その他参考書籍

練習問題 3.

コード(BBEdit, Emacs)

Sample.hs

{-# OPTIONS -Wall -Werror #-}
module Main where

import Data.Array (Array(), (!), listArray)

main :: IO ()
main = do
    print $ f4 ('a', 'b', 'c', 'd') 2
    print $ g4 (listArray (0, 3) ['a'..]) 2
    print $ f6 ('a', 'b', 'c', 'd', 'e', 'f') 5
    print $ g6 (listArray (0, 5) ['a'..]) 5

{--
返す要素の型をaとする。返すのはタプルの要素のいずれかなので、タプルの要素の型は全てa
じゃなければならない。定数時間でランダムアクセスする場合に使えるデータ型の配列が使える
--}
f4 :: (a, a, a, a) -> Int -> a
f4 (x, _, _, _) 0 = x
f4 (_, x, _, _) 1 = x
f4 (_, _, x, _) 2 = x
f4 (_, _, _, x) 3 = x
f4 _ _ = undefined

f6 :: (a, a, a, a, a, a) -> Int -> a
f6 (_, _, _, _, x, _) 4 = x
f6 (_, _, _, _, _, x) 5 = x
-- コードの共有
f6 (w, x, y, z, _, _) n = f4 (w, x, y, z) n

g4 :: Array Int a -> Int -> a
g4 xs i | i > 4 = undefined
        | otherwise = xs ! i

g6 :: Array Int a -> Int -> a
g6 xs i | i > 5 = undefined
        | otherwise = xs ! i

入出力結果(Terminal, runghc)

$ runghc Sample.hs
'c'
'c'
'f'
'f'
$

0 コメント:

コメントを投稿