タグ

ブックマーク / mad.hatenadiary.org (5)

  • ArrowでFizzBuzz(とArrowの再帰に関する問題点) - mad日記

    ふと、Arrowを使ってFizzBuzzが簡単に書けるかなと思ったので書いてみました。結論から言うとあんまり書きやすくはなかったです。ソースコードもちろんif then elseレベルで自分で実装をしているからでして、ライブラリが充実してくればそんなに書きにくいものでもないとは思います。 思わぬ収穫としてArrow用のmapであるmapAを使用する際には、よく注意しないと問題が発生することを見つけたのでそれについても書きます。 ArrowChoiceを使う 普通に剰余を使って書きます。せっかくArrowを使うので、1,2,3,4,5,....というストリームをフィルターに通していくという感じで実装しました。 まず剰余にしたがって分岐が必要なので、ArrowChoiceを使います。ArrowChoiceには4つの演算子があります。 まずleftという関数があって、これは普通のArrowを入力

    ArrowでFizzBuzz(とArrowの再帰に関する問題点) - mad日記
  • C++0xのaxiom - mad日記

    今まで見逃していたけれども, こんなものが追加されるのか! a + b == b + a; (a + b) + c == a + (b + c);みたいな論理的な性質を型に与えることができるという仕様。 Haskellのrewrite rulesを連想したが論文を見つけた。 Axiom-Based Transformations: Optimisation and Testing 仕様は詳しく見ていないけれど, これは夢が広がるなぁ。 一つ残念なのが, 関数の性質を指定することができないであろうということ。 それができたら, 融合変換みたいな面白いこともできただろうに。 言語仕様が巨大すぎるのでいざコンパイラ作ろうと思っても大変だろうな。 C++0x - (無駄仕様) - (Cの負の遺産)のような言語がほしくなってきた。

    C++0xのaxiom - mad日記
    nanakoso
    nanakoso 2008/12/01
  • CPU実験まとめ。 - mad日記

    昨日CPU実験の発表会がありました。私たちのチーム「地下詰妖精」はコンパイラコード18.407秒、ハンドコード17.085秒で歴代の記録を更新し優勝しました。 私はコンパイラ係を担当しHaskellでML言語のコンパイラとアセンブラの製作をしました。 この半年は一ヶ月以上家に帰らない月があったりと、非常に充実(?)したものでした。 来年からCPU実験の内容が変わるので、最後に何か面白いことをやりたいという班結成当初の目標の一つ目は達成できたのではないかと思います。 多分この班が初めて行った事。 実験基盤でゲームを作る テトリスを作成 実機のkoiken君, プログラムのmagicant君, グラフィックのarc君のスキルが見事に合わさった。動いた時は感動した。 自分はminCamlを拡張した言語(minCaml++)のコンパイラを作った。 レイトレーサのコードの徹底研究 uemura君 m

    CPU実験まとめ。 - mad日記
  • 自動微分モジュールで遊ぶ - 2007-12-03 - mad日記

    HackageDBでnumbersというパッケージを見つけました。この中にData.Number.Difという自動微分のモジュールが含まれていたのですが、これがなかなか面白いです。 サンプルコードを全然見かけないので、いろいろと書いてみます。 自動微分とは 自動微分というのは関数の導関数の値を自動的に求めるということですが、これには「数値的」にやる方法と「記号的」にやる方法があります。数値的にというのは という式のhに適当な微小量を与えて、近似的に導関数の値を求める方法を言います。 一方記号的にというのは の様に、微分公式を使用して具体的に関数を求める方法を言います。 Difモジュールが行うのは後者ですが、Haskellの遅延評価と多相型を生かして非常に使い勝手の良いものになっています。プリプロセッサを通すとかいった手間もありません。 自動微分のアルゴリズムについてはAutomatic d

    自動微分モジュールで遊ぶ - 2007-12-03 - mad日記
  • Arrowの心 - 2007-08-16 - mad日記

    昨日の続きです。記法がよいとかMonadみたいに副作用が扱えるとか言ったメリットをはるかに越えたArrowの素晴らしさについて紹介します。 reverse.reverse == id か? 自分が最初にArrowってすごいと気づいた問題がこれです。大学で同級生と話している時に気づきました。大して役に立つ例では無いですが、Arrowの新しい側面が見えてくる例です。 標準入力に対してreverse,reverse,headを順に実行して結果を出力するコードは以下のようになります。後の比較の為に敢えてArrowで書いています。 import Control.Arrow main :: IO () main = getContents >>= print. (reverse >>> reverse >>> head) リストを2回ひっくり返したら元に戻るだけなので、そのheadをとるという計算は一

    Arrowの心 - 2007-08-16 - mad日記
  • 1