タグ

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

  • 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解説)
  • [コンパイラ][Haskell][OCaml] Haskellのinfixの仕組み - mad日記

    OCamlでは < や | で始まる中置演算子は左結合になるため、|> はO.K.ですが、<| 演算子をつなげたときにカッコが必要になってしまいます。 http://d.hatena.ne.jp/mzp/20090105#c1231290114 なんだそれと思ったが,ほんとだった。 | ['=' '<' '>' '|' '&' '$'] symbolchar * { INFIXOP0(Lexing.lexeme lexbuf) } (* 略 *) | ['*' '/' '%'] symbolchar * { INFIXOP3(Lexing.lexeme lexbuf) } とレキサの中で先頭文字だけ('**'のみ2文字)を見て演算子の種別分けをしている。 なんでこんな設計になっているんだろうか。(手抜き? 高速化の為?) ところで,演算子の結合性を指定できる言語にSMLやHaskellがあ

    [コンパイラ][Haskell][OCaml] Haskellのinfixの仕組み - mad日記
  • 1