サクサク読めて、アプリ限定の機能も多数!
トップへ戻る
大谷翔平
debug-ito.hatenablog.com
先日、HaskellのParserについていろいろ調べた。 きっかけは、attoparsecだとやっぱりエラーメッセージが不親切すぎてデバッグがキツい、ということ。 パーサは所詮純粋関数なので、部品を細かく分けてそれごとに単体テストを書いていけばいいという話もあるが、end-to-endテストがいくつかあれば十分な状況で、デバッグのためにいちいちそれをやるのはキツい。 デバッグ用の情報を得ようにも、attoparsecのParserはmonad transformerではないので、自前で動作ログを残すためのモナドを中に仕込むことはできない。WriterTなどで外から包むことはできるが、そうすると今度はパーサコードに大量のliftが必要になる。 megaparsec: Monadic parser combinators 比較的新しいパーサライブラリ。どちらかというとParsecをお手本に、
まともに使い物になるプログラムを作ろうとすると、プログラムの外から何らかのデータを取り込んでパースし、内部で使えるデータに落としこむ処理というのはほとんどの場合で必要になる処理だろう。 しかし、Haskellではこのパース処理を記述するのが意外なほど難しい、と自分は思う。というのも、パース処理というのは「外界から」のデータを「一つずつ」読み込み、しかもそのあらゆる過程で「失敗するかもしれない」処理だからだと思う。もうこの時点で複雑なモナドが必要な気がしてくる。 ということで、Haskellにはこういった面倒なパース処理をうまくやるためにParsecなどのライブラリがあるので、普通は素直にこれを使うのがよい。 しかし、初学者にとってはParsecの学習コストもバカにはならない。特に、パースしようとする対象がごく単純なCSVフォーマットだったりする場合はわざわざParsecの使い方を習得するの
公開しようがしまいが、Haskellでプログラムを作る時はcabalを全面的に使うといろいろメンテしやすい。しかしその使い方(特に.cabalファイルの書き方)は自明ではないということで、いろいろ調べたのでメモ。 .cabalファイルには、とりあえずlibraryセクションは書いておく executableセクションがあろうがなかろうが、自分で書いたモジュールのほぼ全てをlibraryセクションに突っ込んでおくのがよいようだ。executableセクションやtest-suiteセクションで自分の書いたモジュールを参照するためには、各セクションのbuild-dependsに自分自身のパッケージ名を書いておく。 なお、executableパッケージを作る場合、libraryセクションがなくてもtest-suiteのhs-source-dirsにexecutable用のコードを入れたディレクトリ
前回の続きで、今回はPrismについて調べたのでそれについて記す。(lensパッケージ バージョン4.7に基づく) 前回書いたように、PrismはTraversalの一種であり、全体データの中の0個もしくは1個の部分データに着目する。また、Prismは「部分データから全体データを復元することができる」という、Lensにはない特徴を持つ。(そのため、Prismでは「全体」と「部分」という言い方は不適切かもしれない) >>> (Right "hoge") ^. _Right "hoge" >>> "hoge" ^. re _Right Right "hoge" この、Prismの効果を「逆転」する関数であるreがどういう仕組みになっているか気になったので、lensのマニュアルやソースコードを読んだ。 Prismの型 Prismのデータ型は以下のようになっている。 type Prism s t
ここ最近、少し思うところあってHaskellのLensについて勉強していた。 Lensに関するドキュメントをいろいろ探したが、このドキュメントが非常に分かりやすかった。 Zippers and lenses: http://www.scs.stanford.edu/14sp-cs240h/slides/lenses-slides.html#%281%29 "Real World Haskell"の共著者であるBryan O'SullivanによるStanford大の講義スライドらしい。Zipperから話を始めてLensの説明をしている。ZipperについてはすごいH本にも解説があるので、Zipperをある程度理解していれば比較的カンタンに理解できる内容だろう。 ただ、講義スライドの(41)〜(47)あたりはこれだけでは少々わかりにくいと思った。ここはZipperからLensに話が移行すると
ここ数カ月、"jQluster"と名付けたjQueryプラグインに取り組んでいたんだけど、とりあえずリリースできるところまで漕ぎ着けた。 https://github.com/debug-ito/jQluster jQlusterはよそのWebブラウザのDOMオブジェクトなどを操作するためのプラグイン。 普通、jQueryは自分のページの中のDOMオブジェクトを操作したりするために使われるけど、jQlusterは世界のどこかのよそのWebブラウザで表示されているよそのページのDOMオブジェクトを操作する。もちろん、どこのWebブラウザの表示ページでも操作できるわけではなく、同じjQlusterサーバに接続されて管理されているブラウザのページのみ操作できる。 一体そんなもの何の役に立つんだという話ではあるので、デモアプリケーションを作ってみた。 http://jqlusterdemo-deb
PSGIアプリケーション上でお手軽にWebSocketを使うためのモジュールPlack::App::WebSocketをリリースしました。 https://metacpan.org/pod/Plack::App::WebSocket こんな感じで使います。 builder { mount "/websocket" => Plack::App::WebSocket->new( on_establish => sub { my ($conn) = @_; ## Plack::App::WebSocket::Connection object $conn->on( message => sub { my ($conn, $msg) = @_; $conn->send($msg); }, finish => sub { undef $conn; warn "Bye!!\n"; }, ); } )-
Future::Qモジュールを書いた時に他のfuture実装についてもいくつか調べたのでメモ。 futureは(バックグラウンドで)現在進行中の処理と、それが終わったあかつきに得られるであろう結果の値を指し示す(というか保持する)オブジェクト。 http://en.wikipedia.org/wiki/Futures_and_promises 言語によってfutureとかpromiseとかdeferredとか呼ばれるけど、コンセプトとしてはどれも同じようなものなのだと思う。ここでは総称して"future"という言葉を使うことにする。 futureの使い方には主に次の2種類がある。 ブロッキングスタイル futureから値を取り出すAPIが存在する(get()メソッドなど)。処理が進行中で値が未確定の場合、処理が終わるまでブロックする。 ノンブロッキングスタイル futureにコールバック関
PerlモジュールAsync::Queueをリリースした。 http://search.cpan.org/perldoc?Async%3A%3AQueue このモジュールは、あらかじめ登録した非同期処理を立て続けに実行する際に、実行並列度に制限をかけてFIFO実行してくれる、というもの。 ぶっちゃけた話、async.jsのqueueオブジェクトと同じ。(同じAPIを切ってある) 以下、使用例。 use strict; use warnings; use AnyEvent; use AnyEvent::HTTP; use Async::Queue; my $q = Async::Queue->new(concurrency => 3, worker => sub { my ($url, $callback) = @_; print STDERR "Start $url\n"; http_ge
たとえばこんな感じか。 function defined(v) { return (v !== undefined && v !== null) } // ** objからキー _init に格納されるオブジェクトを引き抜き、 // ** objの残りメンバで破壊的に拡張して返す。 // ** objにキー _init が無い場合は空オブジェクトを新規作成して拡張 function build(obj) { var base; var key; if(defined(obj._init)) { base = obj._init; delete obj._init; }else { base = {}; } for(key in obj) { if(!obj.hasOwnProperty(key)) continue; base[key] = obj[key]; } return base;
このページを最初にブックマークしてみませんか?
『debug-ito.hatenablog.com』の新着エントリーを見る
j次のブックマーク
k前のブックマーク
lあとで読む
eコメント一覧を開く
oページを開く