2013年12月3日火曜日

開発環境

初めてのコンピュータサイエンス(Jennifer CampbellPaul GriesJason MontojoGreg Wilson(著)長尾 高弘(翻訳))の10章(アルゴリズム)、10.4(練習問題)、10-2-a, b, c.をHaskellで解いてみる。

その他参考書籍

10.4(練習問題)、10-2-a, b, c.

コード(BBEdit)

Sample.hs

{-# OPTIONS -Wall -Werror #-}
import System.Random

main :: IO ()
main = do
    gen <- getStdGen
    let ns = take 10 $ randomRs (0, 100) gen
    print ns
    putStrLn $ "最小値とその添字: " ++ (show $ minOrMaxIndex ns True)
    putStrLn $ "最大値とその添字: " ++ (show $ minOrMaxIndex ns False)

minOrMaxIndex :: [Int] -> Bool -> (Int, Int)
minOrMaxIndex ns True = minIndex ns
minOrMaxIndex ns False = maxIndex ns

minIndex :: [Int] -> (Int, Int)
minIndex ns = foldl (\(m, i) (n, j) -> if n < m then
                                           (n, j)
                                       else
                                           (m, i))
                    ((maxBound :: Int), length ns) $ zip ns [0..]

maxIndex :: [Int] -> (Int, Int)
maxIndex ns = foldl (\(m, i) (n, j) -> if n > m then
                                           (n, j)
                                       else
                                           (m, i))
                    ((minBound :: Int), length ns) $ zip ns [0..]

入出力結果(Terminal, runghc)

$ runghc Sample.hs
[37,23,81,46,53,38,65,62,71,51]
最小値とその添字: (23,1)
最大値とその添字: (81,2)
$

慣れるまでは{-# OPTIONS -Wall -Werror #-}の記述を消さずに細かく型を指定していくことに。

0 コメント:

コメントを投稿