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

自動微分モジュールで遊ぶ

HackageDBでnumbersというパッケージを見つけました。この中にData.Number.Difという自動微分のモジュールが含まれていたのですが、これがなかなか面白いです。 サンプルコードを全然見かけないので、いろいろと書いてみます。 自動微分とは 自動微分という…

ocamloptを読んだ

ocamloptを読んでみた。そして色々と改造してみたりして分かった事をメモしておきます。 整数値、アドレスのボックス化は2倍して1足すという方法で行っている。 例えばprint_int 100と書くと実際にはprint_int 201という呼び出しになる。 四則演算などは、こ…

ByteStringでwcを書く

Haskellで速いwcを書いてみようという記事を読んだのですが、Haskellの文字列表現は他言語に比べ非常に効率が悪いわけで、それをつかってそこそこ速くしようとするとコードが汚くなってしまわざるを得ないという感じを受けました。そこでByteStringで書いて…

Haskellでのエラー処理

なんでもセミナーで質問があった手前、GHCのガベージコレクションの事とか調べようと思っていたのだけれど、このところ大学の実験で余裕がないので、しばらく実験中に気づいた事とか書いてこうと思います。 Haskellでのエラー処理の難しさ Haskellで手軽に使…

ttf-vlgothic

というパッケージをアップデートしたら,日本語フォントがいろいろと入れ替わってしまった。「オプシポン」がおもしろすぎたので掲載w 何もせず時間が経過したらなぜか明朝は直っていて再現できなくなってしまったのが意味不明かつ残念。太字のゴシック(グェ…

なんでもセミナーの資料を公開します。

少し書き直しなどをしました。 内容に間違いがあれば、ここのコメントなどに指摘を下さるとうれしいです。Haskellがアセンブリになるまで(pdf)

なんでもセミナーが終わりました.

色々と質問とかツッコミとかいただいたのでメモ. ポストプロセッサがあるらしい. Perlで書かれているらしい.知らなかった. 型検査が脱糖より前なのはなぜか。 その方がすっきりするからなのか、そうでなければならないのか. 型エラー時にすでに脱糖されたか…

なんでもセミナー

10/22になんでもセミナーというもので、Haskellについての話をすることになりました。 Haskellの中間言語についてとかそういった話をします。 型推論 糖衣構文 A正規化 STG (Shared Term Graph) C-- ランタイムシステム 非ボックス化 書き換え規則(融合変換…

Dictionary Passing Style

desumasuさんがid:desumasu:20070913で触れられてるDictionary Passing Styleについて書いてみようと思います。参考:栄光のグラスゴーHaskellコンパイルシステム利用の手引以下のようなテスト用モジュールを実験の為に使用します。 module Test (show2 , sho…

main関数について。

GHCのコードを眺めていてmain-isというオプションがあることに気づきました。これを使うとmainとして使用する関数を変える事ができるみたいです。試しにC言語風のmainを書いてみました。 -- Cmain.hs module Cmain() where import Main (main) import System…

Multi-parameter classを利用した強力なポリモーフィズム

Haskellでは型クラスという仕組みにより、ポリモーフィズムが実現されています。 例えば、Showというクラスの場合だと、以下の様にshowという名前の関数により異なる実装が呼び出されるようにできます。 > show 1 "1" > show 1e3 "1000.0" > show True "True…

Template Haskellでコンパイル時にプログラムを走らせる。

Template Haskellを利用してコンパイル時に定数計算を行う方法とIO処理をする方法について書きます。コンパイル時定数計算といえば、C++でのテンプレートメタプログラミングを利用した方法などが有名ですが、同じ事をしてみます。簡単な例として、フィボナッ…

[Haskell] Quasi-quote bracketsを使ってTemplateを書く。

id:MaD:20070906ではTemplate Haskellのコードを書く際に直接Exp型のデータを操作しましたが、Quasi-quote bracketsを使うともっと簡単にテンプレートを書くことができます。ghc, ghciを起動する際にはオプションとして-fthが必要であることに注意してくださ…

Multi-parameter class

本当はTemplate Haskellについて勉強する予定の日だったのだけれど、ちょっと違う方向へそれてしまったので今日勉強したMulti-paramter classというものについて書きます。きっかけは「ParsecでByteStringを使いたい」と思ったことです。同じ事に興味を持っ…

Template Haskellのサンプル

どう書くorgに良い題材があったので、それを使ってTemplate Haskellのコードを書いてみました。 問題は全ての組み合わせです。Haskellではリスト内の要素の型は固定なので、組み合わせはタプルで表すことにします。 また、可変長引数も無いのをどうにかしま…

Applicative

とりあえずいろんなモジュールを先に見とこうということで、Control.Applicativeについて調べました。Applicativeは関数適用を抽象化したもののようです。Applicative.hsでは主に以下の演算子が用意されています。*1 pure *> liftA liftA2 liftA3 Applicativ…

Template Haskell

計算を静的に表す手段としてArrowが使えるという事をid:MaD:20070816で書いたわけですが、もっと強烈な手段としてTemplate Haskellがあります。以前作ったOpというArrowでは(>>>)演算によって繋がれたArrowを一旦構文木としてデータ化し、最適化をした後に関…

副作用のあるArrowの自作 1

副作用のあるArrowを自作してみます。id:MaD:20070816#1187319817で作ったやつは実用性がないので、新しい題材としてストリームに対してのシーケンシャルアクセスを記述するためのArrowを作ってみます。 簡単の為、これから作るArrowの基本動作は以下の2つだ…

FizzBuzz

TraversableでもFizzBuzzに再び挑戦。Haskellに見えない。 import Data.Traversable main = for [1..] (\i -> if (i `mod` 15 == 0) then putStrLn "FizzBuzz" else if(i `mod` 3 == 0) then putStrLn "Fizz" else if(i `mod` 5 == 0) then putStrLn "Buzz" …

Haskellで多重forループを書く

ArrowとかApplicativeとかTraversableとかいろいろ使ってコードを書いてみたいなということで、どう書く?orgに登録しました。とりあえずforループで4つほど書いて見ました。おもしろかったのは、ピラミッドを作ると逆順になるあみだくじ。自然に2重ループが…

Data.Traversable.for

おもしろそうだったので、Traversable.forについて少し調べました。Data.Traversable.forはモナドに対してはmapMと同じ挙動をします。 for [1..10] print と mapM print [1..10] は同じです。例えばリストモナドだとこういう事ができます。 > for [1, 2, 3, …

Arrowの柔軟性

id:MaD:20070820で書いたmapAの問題点ですが、ArrowLoopはそれを解決してくれるものではありませんでした。IOモナドやMonadFixについて勉強不足なので、これらについてしっかりと理解出来てはいないです。 問題が起こるのは、IOモナドとかStateモナドとか副…

おもしろそうなモジュールのメモ

Data.Traversable Data.Foldable Data.Sequence Control.Applicative Control.Monad.Instances Data.Monoid (Applicative内で使っている) 例えば import Control.Applicative import Data.Traversable main = for [1..10] (\i -> print $ "hoge" ++ show i) …

ArrowでFizzBuzz(とArrowの再帰に関する問題点)

ふと、Arrowを使ってFizzBuzzが簡単に書けるかなと思ったので書いてみました。結論から言うとあんまり書きやすくはなかったです。ソースコードもちろんif then elseレベルで自分で実装をしているからでして、ライブラリが充実してくればそんなに書きにくいも…

Arrowパズル解答 (とArrowLoop解説)

まず最初にArrowLoopについて説明します。数学的な話は一切しません(できません)。 ArrowLoopの仕組み ArrowLoopというクラスにはloopという関数が一つだけ属しています。このloopはArrowから新しいArrowを作り出してくれる関数です。 まずloopに入れるArrow…

Arrowパズル

このまえ書いたArrowLoopで階乗を計算するサンプルが全然Arrowらしくなかったので、ArrowらしいArrowLoopのサンプルを書いてみます。 初級編 ??? = loop (snd &&& uncurry(:)) ??? = loop (snd &&& uncurry(++)) ??? = loop $ snd >>> id&&&(id&&&tail >>> u…

Arrowの心

昨日の続きです。記法がよいとかMonadみたいに副作用が扱えるとか言ったメリットをはるかに越えたArrowの素晴らしさについて紹介します。 reverse.reverse == id か? 自分が最初にArrowってすごいと気づいた問題がこれです。大学で同級生と話している時に気…

Arrowでクイックソート

久しぶりに書きます。この1ヶ月半ほどは、大学の試験があったり、塾の夏期講習をやったり、CPU実験が始まった(勝手に始めた)りしたのでブログの事をすっかり忘れてました。んで、現在Haskellでコンパイラを製作なんかをしています。その為にHaskellの勉強を…

ファジー

ちょっと興味があったので、ファジー集合論について勉強してみました。とりあえずファジー論理、ファジー集合について実装。→リポジトリ何かものすごくシンプルな理論なんだという感想。実装も簡単でファジー集合はメンバーシップ度を返すだけのただのファン…

Double Array Trie

SEQUITURがとりあえず動くようになったので、次はDouble Array Trieを実装しようと思います。 Double Array TrieといえばDartsなどが有名ですが、Common Prefix Searchを高速に実行できるデータ構造らしいです。MeCabとかChaSenとかで使われてます。辞書なし…