Haskell

unite-haddock 書いた

http://d.hatena.ne.jp/kitokitoki/20111217/p1 の「ghc-browse-document の anything 化」が便利っぽかったので同じようなものを書いた. https://github.com/eagletmt/unite-haddock ghc-mod が必要.cabal install ghc-mod でインストールできる.Vim 内…

ランタイムに失敗しないインデックス演算子

前回の発展のようなかんじで,GADT を用いて型レベル自然数同士の大小関係を表現する項を作れるようにし,「n が m より小さい」ことを示す項と Vec m a を受け取って n 番目の要素を返す関数を定義してみた. 例によって一度ランタイムに compare して LT, …

ランタイムのチェックを一度で済ます

http://d.hatena.ne.jp/Lost_dog/20111128/1322504143 reify_integer がおもしろいなーと思った. これと同じ雰囲気で, dependent type の例によく出てくる「長さ n のベクトル型 Vec n a」についてこんなのが書けそう. 同じ長さ n のベクトル同士だけ zip…

GHC API を使ってある型コンストラクタのデータコンストラクタを得る

neco-ghc などで,Haskell 用の補完候補をより正確に計算するときに活用できないかなーと思った. GHC 7.0.3 で試した. あるモジュールがエクスポートしている名前は modInfoExports でとれる. そのモジュールで定義されていれば modInfoTyThings で TyThi…

型エラーとして FizzBuzz を出力

GHC で以下のコードをコンパイルしようとすると,型エラーとして FizzBuzz 的なものが出力されます. 出力を見やすくしようとして Template Haskell を使ったら比較的最近の GHC でないとコンパイルできなくなってしまった… 手元の GHC (7.0.3) だと OK で,…

ループ

http://tnomura9.exblog.jp/12169729/ 自分で再帰を書かなくてもどっちもなんとかなる. 以下 import Control.Monad しているということで n 回ループ 今何回目のループかを知りたいときはリストを使って forM_ [1..n] $ \i -> do putStrLn $ "loop " ++ sho…

NamedFieldPuns, RecordWildCards

初めて知ったのでメモ. NamedFieldPuns 旧名 RecordPuns. レコード型のパターンマッチを書くときの手間を少し減らすもの. もともと data C = C { field1 :: Int, field2 :: String } f C { field1 = x } = x + 1 というようにパターンマッチを書けるのだ…

SSL/TLS

Haskell で https な通信を行おうとしたら http://hackage.haskell.org/package/curl http://hackage.haskell.org/package/download-curl といった curl を利用したライブラリを使うのが(たぶん)普通だった. が,最近純粋に Haskell を用いて作られた tls …

ghc_complete をちょっと更新

まず Pragma の補完に対応した. http://github.com/ujihisa/ghc_complete/commit/85f9732c5bc127a0b4fad6b224892be5793d61f2 これで LANGUAGE だとか GHC_OPTIONS といった Pragma 名も補完されるようになった. あとマイナーな変更として,import している…

Scrap your boilerplate

ずっと前から存在は知っていたけど読まずにいた Scrap your boilerplate: a practical approach to generic programming を一通り読んだ. http://research.microsoft.com/en-us/um/people/simonpj/papers/hmap/ これを利用した短いコードを書いてみた. htt…

Haskell で OAuth

hoauth があるけどこれまた使いにくい,というか自分には使い方がわからなかったので自分で書いた. HTTP の Request_String を作るのでこんなかんじに使える. import Control.Applicative ((<$>)) import Network.URI import Network.HTTP import qualifie…

GHC API でモジュールが export している名前とその型を得る

./BrowseType Prelude のように使うと (snip) break = forall a. (a -> GHC.Bool.Bool) -> [a] -> ([a], [a]) catch = forall a. GHC.Types.IO a -> (GHC.IO.Exception.IOError -> GHC.Types.IO a) -> GHC.Types.IO a ceiling = forall a. (GHC.Real.RealFra…

ghc-mod を利用した neocomplcache のプラグイン neco-ghc (ghc_complete.vim) を書いた

せっかく Emacs とは独立して ghc-mod が書かれているので,これを Vim での補完にも利用したいなーと思って書いた. ghc-mod は hackage で公開されているため,cabal install ghc-mod でインストールできる. http://www.mew.org/~kazu/proj/ghc-mod/ http…

Cabal でテストを走らせる

今のところ標準的な方法はないけど,@shelarcy さんによると GSoC のプロジェクトで Cabal の test 機能を改善している最中だそうです. http://socghop.appspot.com/gsoc/student_project/show/google/gsoc2010/haskell/t127230760295 http://cabaltest.blo…

Quiz

なんか見かけたので考えてみた. http://blog.hackers-cafe.net/2010/06/haskell-quiz.html 想定解っぽいもの (+), (!!), (==), sum, print に関しては didn't define と明言されているのに ($) はされてないからまぁこれを自分で定義しろということなんだろ…

ここの型を知りたい

こんなかんじに使う. % echo 'length x' | ./hint [a] % echo 'x + 1' | ./hint (GHC.Num.Num a) => a % echo 'foldl x 0 [2,3]' | ./hint (GHC.Num.Num a, GHC.Num.Num b) => a -> b -> a % echo 'nub x' | ./hint Data.List (GHC.Classes.Eq a) => [a]元…

Evaluate Haskell code anywhere

http://chrisdone.com/posts/2010-04-05-haskell-json-service-tryhaskell.html Try Haskell が eval する API を提供するようになったようなので,適当に Vimperator のコマンドを書いてみた. :hseval take 10 $ scanl1 (*) [1..]とすると [1,2,6,24,120,7…

関数の arity を調べる関数

IncoherentInstances よくわかりません {-# LANGUAGE MultiParamTypeClasses , FunctionalDependencies , TypeFamilies , FlexibleInstances , ScopedTypeVariables , EmptyDataDecls , UndecidableInstances , IncoherentInstances #-} data Z data S a cla…

よくわからない Map

なんかふと思いついたので書いてみた. http://gist.github.com/306554 insert, delete, lookup はできるけど,空間計算量も時間計算量も悪い上に key, value の列挙もできない Map のような何か.

ふつうの純粋な型レベルプログラミング in Haskell

とりあえず fundeps で自然数編.続きはあるんですか? まず,おまじないとして {-# LANGUAGE FunctionalDependencies, MultiParamTypeClasses, UndecidableInstances, FlexibleInstances, EmptyDataDecls, ScopedTypeVariables #-} あたりが要る. 自然数の…

型レベル関数の inverse

元ネタ http://twitter.com/keigoi/status/7828062396 http://okmij.org/ftp/Haskell/PeanoArithm.lhs ようするにこの Inv は何をやっているのかというと,init から limit まで x をイテレートして,x と a に関数 clas を適用したの値と b が等しくなるよ…

Haskell で文字列処理

http://d.hatena.ne.jp/sakura-1/20100113 このへん見てたしかにこういうのがあると役立つなぁと思ったので. まず始めに,Haskell で文字列を扱う場合は主に String を使い,これは Char のリストになっている. もっと効率的に文字列を扱いたい場合には By…

moe で HTML をきれいに書く

Haskell でまともな HTML 吐きたいときに便利. http://hackage.haskell.org/package/moe 使い方は github のほうにある test.hs に書いてあるようなかんじで,実に直感的に書ける. なぜか MPS.Light の - を使って書いてあるけど,これの定義は標準の $ と…

lambdabot のリンクエラーではまった

lambdabot を Arch Linux にインストールしようとして cabal install lambdabot したら,ビルドの途中で can't load .so/.DLL for: ncurses (/usr/lib/libncurses.so: file too short)というエラーがでた. lambdabot.cabal が間違っていたり,ncurses のイ…

もっと fold を使おう

関数型言語というと「ループじゃなくて再帰」というイメージが強くて,実際自分も最初の頃はそう思い込んでいたけど, 実際には fold 等の高階関数を使うほうが多いよという話と,それに関連して foldl と foldr の違いの話. Prelude に様々なリスト操作関…

Vim で Haskell 書くときに

昨日 freenode の #haskell.jp にて nwn さんの呼び掛けで HIMA が行われた. 自分は開催中ちょっと疲れていて頭が働かず,話に参加できなかったけど… その中でかずさんが ghc-mod.el を発表してた. http://d.hatena.ne.jp/kazu-yamamoto/20090930/12542996…

Twidge を試してみたが…

Twitter クライアントの一つである Twidge を試してみた. Haskell で書かれており,コマンドラインから Twitter の API を叩くのに便利なように作られている. -m (--mailto) オプションで結果をメールで送信する機能があるのだけど,これが俺の環境ではう…

乱数をくっつけてその乱数でソート

2回連続で mzp さんのエントリが元ネタ: http://d.hatena.ne.jp/mzp/20090729/shuffle 同じく Haskell で.State とか使わずに素直に「乱数をくっつけてその乱数でソート」を実装してみた. import System.Random import Data.List (sortBy) import Data.Fun…

follower チェックに

follow 通知メールが来たり来なかったりなので,新規 follower がいれば列挙するプログラムを Haskell で書いた. それとついでに remove されたときにもそれを通知する機能もつけた. (新規 follower の数) + 1 回分の API を消費するので注意. エラー処理…

point-free style での書き方

Haskell で普通の記法から point-free style へと変形する方針について考えてみた. きっかけは,この書き込み http://pc12.2ch.net/test/read.cgi/tech/1242876647/11 module Main(main) where import Data.Char import Control.Monad import Data.List mai…