2015-01-01から1年間の記事一覧

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…

慢性上咽頭炎の近況

初めて塩化亜鉛療法(Bスポット)を受けてから2ヶ月ほどが経ったのでここで現状を記録しておく。この2ヶ月、毎週Bスポットを受けたが、症状は若干良くなった程度である。まあどのみち時間がかかるものだと覚悟しているので特にガッカリしているわけではない。…

軽い慢性上咽頭炎と診断された

ここ3,4ヶ月、軽い目まいなどの微妙な体調不良がずっと続いていたが、先日、近所の耳鼻咽喉科で軽い慢性上咽頭炎であると診断された。以下、個人的な記録も兼ねてここまでの状況について記す。

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#%…