Haskell

AttoparsecとMegaparsecについて

先日、HaskellのParserについていろいろ調べた。きっかけは、attoparsecだとやっぱりエラーメッセージが不親切すぎてデバッグがキツい、ということ。パーサは所詮純粋関数なので、部品を細かく分けてそれごとに単体テストを書いていけばいいという話もあるが…

stackageの特定のresolverに上がっているパッケージバージョンを調べるツール

指定したHaskellパッケージのバージョン番号が指定したstackage resolverでいくつなのかを調べるコマンドラインツールを作った。 staversion: What version is the package X in stackage lts-Y.ZZ? 例えばこのように使う。 $ staversion --resolver lts-4.2…

Zipper関連のパッケージ

先日コーディングしていてZipperが必要になる場面に出くわした。それは単純なList zipperだったので自前で実装して済ませたが、ふと、汎用的なZipperライブラリがあるかどうかが気になったので、少し調べた。 syz syz: Scrap Your Zippers Dataクラスインス…

Haskellでテンキーに動的なキーバインドを設定できるやつを作った

テンキーに対して動的なキーバインドを設定するためのHaskellライブラリ"WildBind"をリリースした。 debug-ito/wild-bind: Dynamic key binding framework (GitHub) wild-bind: Dynamic key binding framework (hackage) 現状はX11デスクトップ環境のみサポ…

.cabalファイルのghc-optionsに何を書くべきか

ふと、Haskellパッケージの.cabalファイルのghc-optionsフィールドに何を書いておくとよいか不安になったので、少し調べた。なお、cabalが実際にどのようなオプションをghcに与えているかは--verboseオプションで確認できる。 $ cabal build --verbosestack…

Stackageに自分のパッケージを上げる

最近はもうstackとstackageには頼りっきりで、使いたいパッケージがstackageに入っていないとちょっとイラッとくるくらいになってきたが、そういえば自分もいくつかのパッケージをhackageに上げている。大したものではないとはいえ、それらをstackageに載せ…

GHCにおけるヒープとスタック

先ほど、このような記事をQiitaに書いた。 GHCでコンパイルするプログラムでヒープメモリサイズを制限する - Qiita Haskellを書いていて、再帰関数の終了条件設定をミスって無限ループさせてしまうことが何回かあったのだが、CPUだけでなくメモリも無限に持…

nested Alternative (or MonadPlus)

最近仕事でattoparsecを使ってパーサを書いたりしている。パーサを書く際はAlternativeクラスの(<|>)が便利だ。 (<|>) :: f a -> f a -> f a (a <|> b)とはざっくり言って、「aを実行して失敗したらbを実行する」ということ。Alternativeをアクションだとと…

You can write multiple lines in TemplateHaskell splices

One day, I found out that TemplateHaskell splices (that $() thingy) accept multiple lines (confirmed on GHC 7.6.3), like, {-# LANGUAGE TemplateHaskell #-} import Data.Aeson.TH (deriveJSON, Options(..), SumEncoding(..), defaultOptions) impo…

Haskellでいい感じのHTTPパーサライブラリはない?

「いい感じの」とはずいぶん主観的だが、だいたい以下のようなHTTPパーサが欲しくなってちょっと調べていた。 基本的に(Lazy?)ByteStringに対して作用する。 非IO。 HTTPリクエストとレスポンスをパースできる。 HTTPボディも引っこ抜いてくれる。 HTTPボデ…

lifted applicative style

モナドを使った演算を書いている時は、applicative styleを使うと記述量を少なくできて便利だ。 >>> (++) <$> getLine <*> getLine hoge foobar "hogefoobar" 使う関数が最終的にモナドを返す場合、最後にjoinしてやればいい。 >>> let catPut a b = putStrL…

()は(.)の代わりに使える

例えばこういう関数群があったとして、 toStr :: Float -> String toStr = show length' :: String -> Int length' = length isBig :: Int -> Bool isBig = (> 5) Haskellでは($)演算子を使ってデータに対して次々に関数を適用できる。 isBig $ length' $ to…

haskell-relational-recordチートシート

最近、haskell-relational-recordを勉強しているが、ドキュメントを読むととにかく大量のデータ型(と型シノニム)が出てきてわけが分からなくなるので整理してみた。(relational-record-0.1.1.0, relational-query-0.4.0.1, relational-query-HDBC-0.1.0.0の…

必須引数とオプショナル引数が混在した名前付き引数渡し

Haskellで名前付き引数(named arguments/parameters)のようなことをしようと思ったらレコード構文を活用するのが一般的である。 data Args = Args { arg1 :: Int, arg2 :: Int, arg3 :: String } func :: Args -> Int func = undefined main = print $ func …

cabalを使ってHaskellのプログラムを作り始める時のメモ

公開しようがしまいが、Haskellでプログラムを作る時はcabalを全面的に使うといろいろメンテしやすい。しかしその使い方(特に.cabalファイルの書き方)は自明ではないということで、いろいろ調べたのでメモ。 .cabalファイルには、とりあえずlibraryセクショ…

forkIOがmask状態を引き継ぐ意味が分からない

(注: この記事はghc 7.6.3, base-4.6.0.1で検証している)HaskellのIOモナドには(フツーの命令型言語で言うところの)例外の仕組みが備わっているが、この例外には2種類がある。 同期例外(synchronous exception): スレッド自身が行う処理によって発生する例外…

むつかしいことを考えずにHaskellでCSVをパースする

まともに使い物になるプログラムを作ろうとすると、プログラムの外から何らかのデータを取り込んでパースし、内部で使えるデータに落としこむ処理というのはほとんどの場合で必要になる処理だろう。しかし、Haskellではこのパース処理を記述するのが意外なほ…

どれほどのHackageにChangelogがないのか調べてみたHaskellで

Haskellを勉強し始めて驚いたのが、あまりにも多くのHackage(Haskellにおけるライブラリパッケージ)にChangelogが存在しないことだ。当たり前だが、Changelogがなければモジュールのバージョン間の変化を俯瞰することができない。Haskellの文化では互換性を…

Haskellでの名前空間管理

ここ最近、性懲りもなくまたHaskellを書いてみている。少しずつコツがつかめてきたのか、以前よりストレスなく書けるようになってきたと思う。(Perlに比べると書くスピードは半分くらいだが)ただ、ある程度の大きさのプログラムを1枚のファイルに書いている…

HaskellのlensをPerlに移植したData::Focus 0.01をリリース

HaskellのlensライブラリのAPIと実装をてきとうにパクってきて、Data::FocusというPerlモジュールを作った。 https://metacpan.org/pod/Data::Focus 現状、Haskellのコンパクトなlens実装であるlens-family-coreパッケージに近い作りになっている。lensパッ…

Prismメモ

前回の続きで、今回はPrismについて調べたのでそれについて記す。(lensパッケージ バージョン4.7に基づく)前回書いたように、PrismはTraversalの一種であり、全体データの中の0個もしくは1個の部分データに着目する。また、Prismは「部分データから全体デー…

Lensメモ

ここ最近、少し思うところあってHaskellのLensについて勉強していた。Lensに関するドキュメントをいろいろ探したが、このドキュメントが非常に分かりやすかった。 Zippers and lenses: http://www.scs.stanford.edu/14sp-cs240h/slides/lenses-slides.html#%…

Perl使いがHaskellに入門してみて思ったこと

ここ数ヶ月ばかり、ちょこちょことHaskellをいじってみた上での感想。 今までやったこととしては、 hexpatを使ったXML文書のパース regex-pcreを使った簡単な正規表現処理 Parsecを使った簡単な独自形式の文字列データのパース Cabal, HUnit, QuickCheckを使…