プログラムの性能を測定するにはどうすればよいでしょうか? すぐに思いつくのは,プログラムの実行時間を測定することです。しかし,現在のコンピュータの環境では,プログラムの実行が常に一定の速度で行われる保証はありません。また,Haskellではすべての値が遅延評価されるという事情もあります。 そこで,今回はHaskellプログラムの性能を測定するために用意されているベンチマーク・フレームワークである「criterionパッケージ」について説明します。 ベンチマーク・フレームワークを使うべき理由 プログラムの性能を測定する手軽な方法は,timeやtimeit.exeを使ってプログラムの実行時間を計ることです。しかし,OSの上では様々なプロセスが動作しており,それによってプログラムの実行時間にばらつきが生じます。ほかにも,実行時間にばらつきを生じさせる要因は数多く存在します。ばらつきを生じさせるす
はじめに io-streams パッケージがリリースされた折にふと「conduit,pipes,io-streams 以外の streaming data を扱うライブラリには何があるんだろうか?」と疑問に思いつぶやいてみたところ, machines がある ということを教えていただきました. 気になったので調べてみた,というのが今回の内容です. 基本的な使い方に始まり,何とか attoparsec を組み込むあたりまでは辿り着きました.なお,GHC 7.4.1 を使用しています. 見出し これは何? 雰囲気 どう使うの? 基本形 Source の作成 Process の作成 Transducer を組み込む 複数入力の取り扱い Parser を組み込む おわりに これは何? 今回の対象は↓これ. machines-0.2.3.1 http://hackage.haskell.org/pa
Haskellの静的な型検査は強力ですが,プログラムの実行時に起こり得るすべての問題を解決できるわけではありません。例えば第5回で指摘したように,依存型を持たない現在の標準Haskellでは,検証できる問題の範囲に限界があります。また,FFIを使って呼び出す外部関数には,Haskellの型検査は行き届きません。実行前に静的に解決できない問題は,実行時に動的に解決する必要があります。このための手段を提供するのが例外処理です。 例外処理については,これまで何度か断片的に説明しましたが,全体像をまとめて解説したことはありませんでした。次回以降にFFIと例外処理との関係について説明する前に,今回はHaskellの例外処理についてきちんと説明しておきましょう。 例外処理の仕組みは,GHC 6.10に収録されるbase 4.0パッケージ以降で大きく変更されます。baseパッケージはデファクト・スタンダ
見ろ! Haskell が OOPL のようだ! さてさて、ようやく重い腰を上げて、Lens を勉強し始めましたよ。Haksell for allを見て勉強すればいいのかなと思ったんですが、解説しているパッケージが data-lens なので古いですね。 今、使うべきなのは、lens というパッケージらしいです。解説は、この README を読むのが一番だそうです。この README と Haskell for all をにらめっこしながら、Lens の getter と setter の機能を使ってみます。 背景 Haskell の代数データ型にはフィールドラベルが定義できて、これがいわゆる getter と setter の役割を果たします。Haskell for all から例を引用してみましょう。 data Point = Point { x :: Double , y :: Do
Welcome to the GHC User’s Guide View page source Welcome to the GHC User’s Guide¶ Contents: 1. Introduction 1.1. Obtaining GHC 1.2. Meta-information: Web sites, mailing lists, etc. 1.3. Reporting bugs in GHC 1.4. GHC version numbering policy 1.5. The Glasgow Haskell Compiler License 2. Release notes 2.1. Version 9.10.1 2.1.1. Language 2.1.2. Compiler 2.1.3. JavaScript backend 2.1.4. WebAssembly ba
『簡約! λカ娘(4)』読んだ!おもしろかった!で、その中に「Haskell でも printf じゃないか!?」っていう @nushio さんの記事で、可変長引数関数(可変個引数関数)の話があって自分なりに悩んで納得したので忘れないようにメモしておこうと思う。 作りたいもの 作りたい関数は次のようなものとします。型はイメージ。 printf :: (Show arg1, Show arg2, Show arg3, ...) => arg1 -> arg2 ->arg 3 -> ... -> String printf "Hello, world!" :: String -- => "\"Hello world\"" printf 'I' "am" 23 :: String -- => "\'I\' \"am\" 23" 引数の個数? 正確を期すならそもそも Haskell で可変長引数な
http://d.hatena.ne.jp/perlcodesample/20130227/1361928810 完全に間違っているとか正反対のことを言っているとかいう場合は分かりやすいが、全体的にずれていて一部は合ってる感じなので盛り上がっている。 微妙に日本語がおかしくて、反論も微妙にずれているので平行線。 他の人とだいぶかぶってるような気もするが、とりあえず一項目ずつ分けて考える。 どのような型の値でも代入できる my $str = 'Hello'; my $num = 1; my $nums = [1, 2, 3]; my $person = {age => 2, name => 'taro'}; my $ua = LWP::UserAgent->new; これは静的型付け言語でもできるので動的のメリットではない。 str = "Hello" num = 1 nums = [1,
この記事では, Haskellに用いられる「遅延評価」の仕組みを, 図に描いて説明します. 更に, 遅延評価版のフィボナッチ数の無限列を, JavaScriptで実装します. 遅延評価とはどのように動くのか, 考えて行きましょう. HaskellのコードとJavaScriptのコードの比較 Haskellでの x = y y = 10 と, JavaScriptの var x = y; var y = 10; というコードを考えてください. Haskellのコードは, これだけでは何も起こりません. print xとすると, x = y = 10 となって 10 が表示されます. 一方, JavaScriptのコードは var x = y; を評価した瞬間, 「ReferenceError: y is not defined」というエラーが出ます. 更に, main = let x = 1
ソフトウェア開発に Scala や Haskell、Erlang といった関数型言語を採用する企業が増えているそうだ (ITpro の記事より) 。 関数型プログラミング言語には「迅速に開発できる、バグを抑えやすい、アプリケーションの性能を向上させやすい」といった特徴があるとし、これらは新規のサービス開発に向いているという。「言語選定が競争力に直結」といった意見も記事には掲載されている。 これだけだといいことずくめのようにも聞こえるが、関数型言語は習得しにくく、ライブラリなども C/C++ や Java と比べるとまだ少ない。使いこなせるプログラマも少なく、関数型言語で大規模システムの設計を行えるエンジニアはまだ少ないのではないだろうか。関数型言語を使える人材はある程度スキルの高い人であり、そのために生産性が高いのではという疑問もある。今後日本で関数型言語の採用は進んでいくのだろうか?
Haskellって、変数に束縛されている値が「評価されている」と「されていない」の状態を持っていて、それがグローバルにあちこちから共有されているから「どれくらいの計算量で終わるか」みたいな議論になるとイメージが掴めなくて困っていた。確認する方法があればいいのになぁ、でも、ないんだろうなぁと、諦めていたが、GHCiである程度できることがわかった。面白いじゃんこれ。 まずこんなソースコードを用意してみる。これは「リストを結合した時点で前半のリストは評価されるのか否か」を実験するためのコード。以前議論になったときに、僕の主張としては「前半を評価しないでも『xsの先頭1個と「xsの残りとysを結合したもの」のcons』を返せば良い。きっとその実装になってるだろう」というものだったのだけど、今までは挙動を観察する方法を知らなかったので議論止まりだった。 xs = [1, 2, 3] ys = [4,
#Haskellの単体テスト最前線 [To English] これはHaskell Advent Calendar 2012の5日目の記事です。 Haskellで作成したパッケージに対して、単体テストを書くための最新情報をお届けします。以下の記事では、Haskell Platform 2014.2.0.0 以降を使うことを前提とします。 ##要約 要点は4つです。 利用者に見せたい振る舞いは、doctest で書く 利用者に見せたくない振る舞いは、hspec で書く テストを自動化するフレームワークとしては Cabal を使う doctest でも hspec でも、純粋なコードに対しては、できるだけ QuickCheck などの性質テストを書く この記事で一番伝えたいのは、3) です。例題としては、Base64 という符号化を取り上げます。Base64 は知っていると仮定して話を進めます
当たり前の事を当たり前にやりたいよね。 ちょっとしたスクリプトを書く時に、OSのコマンドを実行してその結果をgrepしてcutしてとか、そういう事をよくやる。Haskellでやるかどうかっていうのは別として、そういうのってどうやるんだろうと思って。 grepとかcutとかはHaskell的にはパーサを書くのかもしれないけど、まずはコマンド実行から。 とりあえずコマンド実行 マニュアルを"cmd"とかで検索するとSystem.Cmdとかが出る。 System.Cmd 使い方はこう。 Prelude> import System.cmd Prelude System.Cmd> system "pwd" /home/user ExitSuccess ExitSuccessが戻り値で、画面出力はなんかそのまま標準出力に出ちゃう。 引数があっても > system "netstat -l" と指定で
「純粋関数型言語はデバッグしにくい。だって純粋な関数で printf デバッグできないから」とつぶやいている人をよく見かけます。これまで放置してきましたが、リツイートが50を超えたので、Haskellでのデバッグについて書きます。 例外処理と同じように、Haskell でのデバッグでは、純粋な関数と IO を分けて考える必要あります。 IO での printf デバッグ IO では、putStrLn や print が使えるから問題ないですよね? foo :: Int -> IO Bool foo i = do x <- あれして i putStrLn $ "x = " ++ show x これして putStrLn "ここも通過" -- それもする y <- それもする print y return y ちなみに、forkIO 起動した軽量スレッドから putStrLn する場合、軽量ス
リリース、障害情報などのサービスのお知らせ
最新の人気エントリーの配信
処理を実行中です
j次のブックマーク
k前のブックマーク
lあとで読む
eコメント一覧を開く
oページを開く