タグ

ブックマーク / otter-o.hatenadiary.org (6)

  • モナドと実行順序のこと - 取り急ぎブログです

    kazu-yamamotoさんのコメントいただいて、モナドの実行順序関連の振る舞いについて考えてみました。 bind (>>=) が、右辺を実行する前に左辺を実行し終えるかについて。 リストもモナドなことは前回にも述べましたが、リストのモナドインスタンスの実装は以下のようになっています。 instance Monad where m >>= f = concatMap f m return x = [x] fail s = リストモナドのbindでは、concatMapを使っているので、右辺の実行は左辺の実行終了を待たないことになります。リストのモナド性をつかうと、結構面白いことができて、 [1, 2, 3] >>= (replicate 2) [1,1,2,2,3,3] なんて事が起きたりします。それはさておき、無限リストを利用して、bindを試してみました。 [1..] >>= (fi

    モナドと実行順序のこと - 取り急ぎブログです
  • MonadIOクラスのこと - 取り急ぎブログです

    昨日のモナドトランスフォーマーの勉強中に使ったliftIOですが、勘違いをしていたことにやっと気がつきました。liftIOの型情報は liftIO :: IO a -> m a と、この関数だけ見るとIOアクションをほかのどんな形のモナドにでも挿げ替えてくれるハッキーな関数のようにしか見えなかったのですが、もうちょっと周りを見ると、実は、このliftIOはMonadIOというクラスのメソッドなんですね。そして、このクラスのインスタンス宣言のほうにも大切な情報が隠れていました。 class Monad m => MonadIO m where liftIO :: IO a -> m a Instances MonadIO IO MonadIO m => MonadIO (ListT m) MonadIO m => MonadIO (ContT r m) (Error e, MonadIO m

    MonadIOクラスのこと - 取り急ぎブログです
  • モナドと実行順序のこと、結末 - 取り急ぎブログです

    kazu-yamamotoさんの http://d.hatena.ne.jp/kazu-yamamoto/20080212/1202793403 に導かれてnobsunさんの http://haskell.g.hatena.ne.jp/nobsun/20060907/monadicIO http://haskell.g.hatena.ne.jp/nobsun/20060908 の2つの記事をざっと読みました。nobsunさんの丁寧な説明がすごいですね。IOモナドはすべてWorldをパラメータにとる「アクション」だというところ、なるほどそうだったんだと思いました。 色々と読んみてわかったのは、Stateモナドのように、IOも関数をパッケージ化しているモナドだと考えることができるということで: IO a = World -> MakeIO a World という風に見ることができる。だとすると

    モナドと実行順序のこと、結末 - 取り急ぎブログです
  • Applicative勉強中 - 取り急ぎブログです

    ちょっと前から、時間を見つけてはApplicativeについての論文を読んでいます。まだいくつか(も)疑問点が残っているので、まだまだ説明はできないのですが、いくつか面白いことが出ていたので...小出しに書いていこうと思います。 概要としては、ApplicativeはFunctorとMonadの間にあるもので、全てのApplicativeはFunctorだし、全てのMonadはApplicativeだけど、その逆は成り立たないようです。つまり Functor > Applicative > Monad :ここでA > B = B is subset of A という存在らしいです。そしてMonadクラスをApplicativeとしてみるときにカギになるのがap関数というもので: ap :: Monad m => m (a -> b) -> m a -> m b ap :: (Monad m

    Applicative勉強中 - 取り急ぎブログです
  • Arrowのことその3 - 取り急ぎブログです

    前回までArrowの概要をザーッと流したわけなんですが、取りこぼしたことをいくつか… ArrowはWrappedArrow経由でApplicativeとFunctorのインスタンスになっているようです。まぁ、関数(->)自身がApplicativeやFunctorのインスタンスなので、関数をくるんだArrowがそうであるのもわからないではないですね… Arrowのクラスインスタンスには関数(->)のほかに: Monad m => Arrow (Kleisli m) newtype Kleisli m a b = Kleisli { runKleisli :: (a -> m b) } というのがあって、モナドのバインド(>>=)の第2引数にあたるシグネチャの関数をArrowとして扱うことができるようになっています。普通のdo文では最初の行以外は全て基的には>>=てつながっているので、つま

    Arrowのことその3 - 取り急ぎブログです
  • Hindley/Milner type systemのこと - 取り急ぎブログです

    しばらく更新を怠っていました。今もまだ余り時間が取れないのですが、Doukaku.orgの問題を少し見る余裕が出てきました。平行して、いくつかHaskell関係の論文を読んでいたのですが、そのうちの一つ、Functional Programming with Overloading and Higher-Order Polymorphism (http://web.cecs.pdx.edu/~mpj/pubs/springschool.html) を読んでいて発見したことをかきます。 Haskellでも使われている型宣言文法であるHindley/Milner type system (以降HM)はそのおおもとのアイディアはなんと1969年に考案されていたようです…Fortran(1960年代)やLisp(1965年)に比べれば後にはなりますが、C(1972年)よりも前からあるものなんですね

    Hindley/Milner type systemのこと - 取り急ぎブログです
  • 1