人気ブログランキング | 話題のタグを見る

手続き型言語風の Haskell プログラム

手続き型言語のプログラム風に見える Haskell プログラムを書いてみた。簡単な統計量を計算するプログラムだ。(行頭のアンダースコアはスペースに置き換える。)順次実行するようなアルゴリズムは、IOモナドでない純粋関数のプログラムでも let ~ in 文を利用するとそれらしく書くことができる。

手続き型プログラム言語風のプログラムを書くということは、プログラムの文が順次実行されることが期待されることを示しており、見た目だけでなくアルゴリズム的にも意味がある。

なんということはないプログラムだが、これを知らないと Haskell を道具として使えないという小ネタがいっぱい詰まっている。

module Statistics where

data Stat = Stat {n :: Int, mean :: Double, var :: Double, sd :: Double}
__ deriving Show

statistics xs =
__ let
____ n = length xs
____ mean = (sum xs) / fromIntegral n
____ var = (sum $ map (\x -> (x - mean) * (x - mean)) xs) / fromIntegral n
____ sd = sqrt var
__ in
____ Stat n mean var sd

main = do
__ putStr "input file name: "
__ fname <- getLine
__ contents <- readFile fname
__ let rawdata = map (read :: String -> Double) $ lines contents
__ let result = statistics rawdata
__ putStrLn $ show (n result)
__ putStrLn $ show (mean result)
__ putStrLn $ show (var result)
__ putStrLn $ show (sd result)

実行例

$ runhaskell statistics.hs
input file name: data
3
2.0
0.6666666666666666
0.816496580927726


by tnomura9 | 2019-05-22 07:31 | Haskell | Comments(0)
<< IO モナドの概観 アキュームレータと畳込み >>