タグ

2012年1月3日のブックマーク (6件)

  • ArrowLoop - 言語ゲーム

    さて、気分を変えて ArrowLoop をやります。論文に書いてある loop f b = let (c,d) = f (b,d) in c の意味が全く分からなくて Arrow の勉強が一ヶ月近く停滞していたのですが、id:MaD さんが素晴らしい解説 http://d.hatena.ne.jp/MaD/20070818 を書かれているので自分なりに写経します。loop を使って普通のループを作るには、引数として関数を一つ与えます。関数の型は (b,d) -> (c,d) のような入出力ともタプルとします。よくある図で示すと、タプルの後ろの引数がくるりと入力に繋がれる形をしています。 import Control.Arrow nonsense (b, d) = (b + 1, d * 2) -- *Main> loop nonsense 1 -- 2 -- このしようも無い例では、b +

    ArrowLoop - 言語ゲーム
  • Applicativeのススメ - あどけない話

    この記事の目的は、Applicative 信者による Applicative スタイルの布教です。 簡潔に結論を述べると、 foo = do a <- m1 b <- m2 return (f a b) のようなコードを書きたくなったら foo = f <$> m1 <*> m2 と書きましょうということ。 合い言葉は、「do と return をなくせ!」です。 FunctorとMonadの間 Functor を特殊化した型クラスがMonadで、Monadの方が強力です。なぜなら、メソッドが増えるからです。 Functorのメソッドはfmapです。fmapの別名を (<$>) といいます。(この記事では、(<$>) と liftM を同一視します。) そして、Monadのメソッドは、ご存知の通り (>>=) と return です。 FunctorとMonadの間にApplicative

    Applicativeのススメ - あどけない話
  • GADTs使ってみた - Faith and Brave - C++で遊ぼう

    このエントリは、Haskell Advent Calendar 2011の参加記事です。 今回は、HaskellのGHC拡張であるGADTs(Generalized Algebraic Data Types : 一般化代数データ型)を調べて使ってみたという内容を書いてみました。 最初に、GADTsはGHC拡張なので、使用するには以下のようにして拡張を有効にする必要があります: {-#LANGUAGE GADTs #-} まずは構文的な違いを、Maybeを例にして見てみましょう。 通常の代数データ型では、Maybeは以下のように書きます: data Maybe a = Nothing | Just a GADTsでは以下のように書きます: data Maybe a where Nothing :: Maybe a Just :: a -> Maybe a 通常の代数データ型では、データコンス

    GADTs使ってみた - Faith and Brave - C++で遊ぼう
  • 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日記
  • 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日記
  • mad日記 - Arrowパズル解答 (とArrowLoop解説)

    まず最初にArrowLoopについて説明します。数学的な話は一切しません(できません)。 ArrowLoopの仕組み ArrowLoopというクラスにはloopという関数が一つだけ属しています。このloopはArrowから新しいArrowを作り出してくれる関数です。 まずloopに入れるArrowはこんな形をしています。 入力が2つあり、出力も2つあります。ただし、Arrowは入力と出力がどちらも1つずつでなければならないので実際はタプルとして入出力します。標準ライブラリで定義されているArrowLoopクラスのインスタンスには普通の関数と、モナドをArrow化したKleisliというArrowがあります。 ここでは例として次のArrowを考えます。 swap_mul = \(x, y) -> (2 * y, 3* x) 実行例 > swap_mul (3, 4) (8,9)簡単な関数です

    mad日記 - Arrowパズル解答 (とArrowLoop解説)