haskell

random walk

より、 偏りのないコインを投げつづけよう。ここで、「偏りのない」とは、「表」と「裏」が等しく0.5の確率で出る事を意味している。投げるごとに、表がでたか裏が出たかを記録する。それぞれの回数はどのように増えていくのだろうか?たとえば、ある時点で…

2次元random walk

前のエントリを2次元に拡張したもの。1次元版ではコインの表裏を+1/-1に対応させていたが、今回は方角、つまり東西南北を縦軸と横軸に対応させる。実験では平面上に100万ステップ分をプロットしている。するとこんな図や、 こんな図になる。おもしろい。 以…

ネストしたincludeに対応するlexer

Cの#includeとか設定ファイルのincludeディレクティブ的なincludeに対応するlexerメモ。「*」指定などのglob対応。Parsec 3で。 tIncluded :: Stream String IO Char => ParsecT String u IO TokenType tIncluded = lexeme $ do try $ symbol "include" glob …

quoteされた文字列用lexer

quoteされた文字列(文字列リテラル)用のlexerメモ。Parsec 3で。 tQuoted :: Stream s m Char => ParsecT s u m TokenType tQuoted = lexeme $ Quoted <$> between (char '"') (char '"') (many quotedChar) where quotedChar = try escapedQ <|> C.satisf…

inet_addrはネットワークバイトオーダーではない

manpageには The inet_addr() function converts the Internet host address cp from IPv4 numbers-and-dots notation into binary data in network byte order. と書いてあるのに、下記プログラムの出力はリトルエンディアンになっているのは何故だろう。 #…

StateT

import Control.Monad.State tick :: State Int Int tick = modify (+1) >> get tickT :: StateT Int IO Int tickT = modify (+1) >> get >>= liftIO . print >> get main :: IO () main = do print $ runState (tick >> tick >> tick) 0 runStateT (tickT >…

自前の例外を扱う

所謂extensible exceptionsというやつ。すぐに忘れそうなのでメモ。 {-# LANGUAGE DeriveDataTypeable, ScopedTypeVariables #-} import Control.Exception import Data.Typeable import Prelude hiding (catch) data MyException = MyException deriving (S…

Control.Concurrent.Chan

最小サンプル。生産者がチャネルに一秒ごとにインクリメントされていく値を書き込み、複数の消費者がチャネルから読み出した値をプリントする。とってもお手軽。 import Control.Monad import Control.Concurrent type ID = Int main :: IO () main = do ch …

賢いお尻の舐め方

でかいファイルの最後の行を取り出したいときにどうすればよいか。Cだったらmmapしてお尻から舐めていけばいい?けど、標準ライブラリにmmapもないのであんまりうれしくない。seekで頑張るならこんな感じか。 import Control.Exception import Control.Monad…

モナドとシェル

モナド則 (return x) >>= f == f x m >>= return == m (m >>= f) >>= g == m >>= (\x -> f x >>= g) はbindをパイプ、returnをcat、fをgrep hogeなどの適当なコマンドとすると、 cat x | grep hoge == grep hoge x grep hoge x | cat == grep hoge x (cat x …

-XOverloadedStrings

support for bytestring literals (use -XOverloadedStrings) bytestring 0.9.0.4 - fa.haskell | Google グループ main = print ("abcdef" :: ByteString) bytestring 0.9.0.4 - fa.haskell | Google グループ いいじゃない。でも、リテラルだけらしい。 Pr…

[http://pira.jp/nandemo/wiki.cgi?page=62:title=Haskellがアセンブリになるまで]

これ 行ってきた。参加者は30人程度。GHCのコンパイルの流れに沿って、基本的な動作を解説していく感じ。id:MaDさんの声が良かった。ところで、desugarのタイミングが遅い事について質問が出ていたけど、何処かで読んだなあと思って検索してみたらコメンタリ…

多数のスレッドの終了を待つ

セマフォで書ける。 test n = do sem <- newQSemN 0 mapM_ (\i -> forkIO $ print i >> signalQSemN sem 1) [1..n] waitQSemN sem n もっと綺麗な方法はあるのかな?

Haskell on Rails

写真を整理していて肝心なことを思い出した。ただそれだけ。反省はしていない。

はてなでLiterate Haskell

これまでLiterate Haskellはあまり好きではなかったんだけど、はてなグループで文章とコードをまとめ始めたら、これがけっこう嬉しい。スーパープレ記法で >|lhaskell| > main = putStrLn "hello, literate haskell" ||<みたいに書いておけば*1、後で文章ご…

まともなebuild

ghc-darcsの自前ebuildを使ってビルドすると,core-packagesやextra-packagesなどGHCに含まれるライブラリも一緒にインストールされるため,Portage経由で入れたパッケージと競合する.ここら辺を綺麗にまとめるebuildを各必要がありそう.virtualパッケージ…

[http://research.microsoft.com/~simonpj/papers/history-of-haskell/index.htm:title=A History of Haskell: being lazy with class]

著者がすごい人ばかり.歴史やら文法やらモナドができる前のI/OやらseqやらDSELやら盛りだくさんなのであとで読む.

fmap

fmapのfはたぶんfunctorのfで日本語では「カンシュ」というらしいことはわかる.でも,函手なのか関手なのかよくわからないし,fmapがよく中置演算子として使用されているのもなんでかわからない.圏論を学べっていうことか.

一辺の長さがsの正n角形

The Haskell School of Expressionの問題.一辺の長さがsである正n角形の各頂点を求める.書きやすさのため複素平面で考える.正n角形の内角はなので,各頂点でだけ回転させていけばよい.各頂点はにを足したものになる.ただし,,は点をだけ反時計回りに回…

hoogle-cmdline

Hoogleのコマンドライン版のhoogle-cmdlineというのがあるらしい.Emacsからも使えるようなのでひとまずebuildを書く. $ cat /usr/local/overlays/portage/dev-haskell/hoogle-cmdline/hoogle-cmdline-20061107.ebuild # Copyright 1999-2006 Gentoo Founda…

コメンタリー

GHCのコメンタリー.両Simonが出ているビデオもある.

メモ

Google Custom Search How to write a Haskell program - HaskellWiki

型なしラムダ計算電卓

404 Not Found.layman -a haskellするとebuildが使えるけど,shellacとshellac-readlineへの依存が抜けているのでこける.これを修正してShellac.cabalに Ghc-Options: -fallow-undecidable-instancesを追加すると正常にインストールできる.コマンド名labm…

メモ

モナド変換子のチュートリアル 要素の追加・取り出しがO(1)のdeque

GHCのビルド

いままでebuildに頼っていたから気がつかなかったけど,LANG=Cしないとlexical errorでこける.

モナド

A Neighborhood of Infinity: You Could Have Invented Monads! (And Maybe You Already Have.)

Haskell情報

Haskell - Wikibooks, open books for an open world

ghc-darcsメモ

http://www.haskell.org/~gentoo/gentoo-haskell/portage/dev-lang/ghc-darcs/ghc-darcs-6.5.ebuild

HaskellとGtk2Hsとモナドとマンデルブロ集合

先週研究室のM1のTくんがVC++でマンデルブロ集合を表示するプログラムを作ってきた.これはHaskellで書き直さないと気が済まない.ということで書いてみた.モナドが難しくて丸一日費やした. あらすじ 簡単にまとめると以下の通り. マンデルブロ集合の計算…

[http://www.sampou.org/haskell/a-a-monads/html/:title=All About Monads]

これを一通り読んでParsecとSTMを弄ればモナドの有用性をよく理解できるんじゃないか.と目論んでいる.

リスト操作

Hugsにて:set +sした結果.計算結果自体は省略. Hugs.Base> [id x | x <- [1..10000]] (2300046 reductions, 3788974 cells, 3 garbage collections) Hugs.Base> map id [1..100000] (2400047 reductions, 3888975 cells, 3 garbage collections) Hugs.Base…

fibs

zipWithより短いfibs fibs = 1:scanl (+) 1 fibszipWithの方が若干早い模様.

seqの謎

正格評価するためのseqがよくわからない.Preludeに定義されているらしいのでGHC-6.4.1*1のPrelude.hs*2を見てみると次のように定義されている. seq :: a -> b -> b seq _ y = yこれはいったいどういうことか.このような定義のseq'を自分で定義しても当然…

myReverse2

反転されたリストを返すmyReverseは以下のようにもっと簡潔に書ける. myReverse2 :: [a] -> [a] myReverse2 [] = [] myReverse2 (x:xs) = myReverse2 xs ++ [x] ++が使えるのでわざわざconsする必要がないということ.Common Lispの (defun my-reverse2 (x)…

Haskell入門追加

Haskell のお勉強

リスト操作

Common Lispの基本的なリスト操作をHaskellで書いてみた. まずはCommon Lisp. (defun my-length (x) (if (null x) 0 (+ 1 (my-length (cdr x))))) (defun my-append (x y) (if (null x) y (cons (car x) (my-append (cdr x) y)))) (defun my-reverse (x &o…