読者です 読者をやめる 読者になる 読者になる

レガシーコード生産ガイド

私に教えられることなら

HaskellとJavaScript(Node.js)でテストデータ出力スクリプトを書き捨て #_poh

JavaScript Haskell

paizaってとこのオンラインハッカソン(結婚がどうのこうのというやつ)、JavaScriptで3問目が100%とれない。

どんなテストケースでどういう風にエラーが起きているのかわからないので、とりあえず標準入力がチャンクで区切られた時にちゃんと処理できるか確認するために、テストデータ出力スクリプトを書いてみた。

こういう小物、日常生活で使うスクリプトHaskellで気軽に書きたいなと思うので、できるだけ短時間で適当に書いて、JavaScript版と比べてみた。

JavaScript

var t = process.argv[2],
    n = process.argv[3];

var fs = require('fs');
var i;

function ranInt (n) {
    return Math.floor(Math.random() * n);
}

console.log(t + " " + n);

for (i = 0; i < n; i++) {
    console.log(ranInt(10001));
}

Haskell

import System.Environment
import System.Random
import Control.Monad

main = do
  (width:n:[]) <- getArgs
  putStrLn $ width ++ " " ++ n
  g <- getStdGen
  mapM_ putStrLn $ map show $ take (read n) $ (randomRs (0,10000) g :: [Int])

どちらもコマンド名 幅 データ数で出力する。例えばnode data.js 5 30000みたいに。 比べてみた感想は

  • Haskellのimportが面倒、BasicPrelude?とかでどうにかなるのかな。requireだと感じないので慣れかな。
  • Haskellの方はいろいろとエラーが出て、乱数出力までが長く感じた。
  • 行数はHaskellのほうが短いけど文字数は一緒ぐらい(wcの結果)

もうちょっと型に慣れたり、ここから拡張していけばHaskellの良さを感じられるのかな、という結論。慣れましょう。

そしてオンラインハッカソンの方は結局よくわからない。

広告を非表示にする