haskell

DataKinds 言語拡張を使って Typed Heterogeneous List とその基本操作を実装してみた

DataKinds 言語拡張のおかげで、 [String, Bool] のような型レベルのリストリテラルが扱えるようになり、 異なる型の要素を持つことができるヘテロリスト、それも Dynamic のようなユニバーサル型を使った Untyped なものではなく、各要素ごとに異なる型付け…

Singleton types を使ってみる

型レベルでのプログラミングをする際、よく「値」が存在しない型 ( i.e. EmptyDataDecls な型。 DataKinds で Promoted されたデータコンストラクタとか。 ) を「型レベルでの値」として扱うけれど、これはつまり実体を持っていないということだから、まるで…

Haskell で非同期 HTTP Request

複数の HTTP Request を非同期で実行する例 ( http.async.client のコールバックAPIを使って非同期 HTTP Request - hyoneの日記 と同じ題材 ) を async ライブラリを使って書いてみた。 参考にしたサイト Conduit + Attoparsec (+ Concurrent) - yunomuのブ…

型レベルで FizzBuzz

最近、 Type Family, Datatype Promotion, Kind Polymorphism といったあたりの話をいろいろ読んでいたので、練習に型レベルで FizzBuzz を書いてみた。型レベルの計算の記述は、まだまだ冗長でスマートでない感じだけど、 GHC 7.6.1 で導入されたという Pro…

ある型のうち一部の複数のデータコンストラクタのみを受け付ける関数を定義する

GADTs を使うと、以下のように、ある型のうち、特定のデータコンストラクタのみを受け付ける関数を書くことができるようになるけど、これだと、ある型のうち1つのデータコンストラクタだけ受け付ける関数しか定義することができない。指定した複数のデータコ…

Monad 変換子を使って List Monad でロギングできるようにする

Monad 変換子を使う練習として、 List Monad の中で Writer Monad を使ってロギングできるように変換してみる。まず、題材として、葉の数が n である二分木の全ての組み合わせの数を返す count 関数を定義。ここで count 関数の do 式での処理過程を Writer …

リストをN個ごとにサブリストに分割

リストをN個ごとにサブリストに分割する関数を splitAt と State Monad を使って書いた。結局、 Data.List.Split.splitEvery にあったれど。

Haskell で XML Scraping

Twitter API から XML を取ってきて、ツイートの URL 一覧を抜き出す。