Haskell

Arrowのことその3

前回までArrowの概要をザーッと流したわけなんですが、取りこぼしたことをいくつか…ArrowはWrappedArrow経由でApplicativeとFunctorのインスタンスになっているようです。まぁ、関数(->)自身がApplicativeやFunctorのインスタンスなので、関数をくるんだArro…

Arrowのこと、その2

前回のポストに引き続き、Arrowを攻略していきたいと思います。もう一度、Arrowのクラス定義を引っ張ってきます。 class Arrow a where arr :: (b -> c) -> a b c pure :: (b -> c) -> a b c (>>>) :: a b c -> a c d -> a b d first :: a b c -> a (b, d) (…

Arowのこと

Haskellを勉強し始めて、モナドのことを知ってちょっとしたころに名前だけ見かけて、実際どんなものなのかを知りたいと思っていたのがArrowです。こちらhttp://www.haskell.org/arrows/で見つけられるような説明を読んだりしたのですが、もう、半年ぐらいち…

Functorをちゃんと見ておく

先日はMonoidとFunctorのことで玉砕してしまいました。色々教えていただいたので、ここらが攻め時ということで、もう一押しです。Monad, Monoid, Functor, Applicativeなどを見ていていつもこんがらがっちゃうのが、それらが一体何のサブクラスなのかという…

Functorの混乱

[追記:おかしいところについて]用語の混乱があったり、勉強不足があったりで、間違ったことを書いてあります。まず、functorなんですが、これは圏論での関手が英語圏ではfunctorと呼ばれていたり、C++などで使われるファンクターというものがあったり、さら…

Haskellで(むりやり)やるオブジェクト指向

Haskellにもclassがあるのだから、C++とかで見るオブジェクト指向もできるでしょうということで、無理やりやってみました...笑って見過ごしてやってください。一応、クラスの継承関係もできるので、ここではObject -> Animal -> (Dog, Cat)という構図になっ…

Programming Windows in Haskell

えー、いまさら何をやってんだという声も聞こえてきそうですが、普段Win32を使うことがとても多いので、Haskellで簡単なWin32のアプリを書いてみました。ちょっと長めなサンプルなので、コードは最後につけときます。Win32でウィンドウを表示する基本的なプ…

Haskellでのリソース管理

C++にあってCにないものの一つ、クラスのコンストラクタとデストラクタがあります。これを使えば、スマートポインターなどといった、リソース管理を半自動化することができるような便利なクラスを定義できるようになるわけです。プログラムを書いていると、…

do文の意味

きっかけは、こんな雰囲気のコードでした: main = do args もうちょっとましな書き方はあるだろうという話はここでは触れないことにして、これは、コンパイルしないわけです。エラーは:do.hs:10:12: Not in scope: `args'つまり、最後の行(x:y:_)=argsで使…

順列組み合わせの生成

重複、省略のない順列を返す関数を書いてみました。なんだか、もっと簡単にかけそうな気がするのですが、さっぱりといきません…Preludeとかにあっても驚かない気もするのですが、見つかりませんでした。順列生成の元となる要素集合をリスト[a]で与えて、そこ…

Hindley/Milner type systemのこと

しばらく更新を怠っていました。今もまだ余り時間が取れないのですが、Doukaku.orgの問題を少し見る余裕が出てきました。平行して、いくつかHaskell関係の論文を読んでいたのですが、そのうちの一つ、Functional Programming with Overloading and Higher-Or…

関数の合成の誤解

さて、先日のポストで書いたコードなんですが、 pure f pure g (ZipList xs) これ、コンパイルエラーがでます。前にもこんな様なコードを書いておこられて、はっきりとした理由がわからないままあきらめていたのですが、今回理由がわかったので書いておきま…

Haskellの再帰とCのループの違い

今日は、Haskellでのmapについて少し考えてみたいと思います。 Cでこんなコードを書いてみます: void foo() { int rg[10]={}; int i; for (i = 0; i この関数fooにはループが4つありますね...一つ目は配列rgの中身を初期化してます。2つ目と3つ目は各要素…

IO+Maybe=?

Haskellについては、まだまだわからないことがいっぱいあるのですが、少しコードが書けるようになってきたころに躓いていたことがあります。Maybeモナドのことです。どこで知ったかは忘れてしまいましたが、Maybeは処理の中断をうまく表現できるので、C言語…

Monoidのこと

昨日のポストで取り上げた変わった型のApplicativeの2つ目: instance Monoid a => Applicative ( (,) a) where pure x = (mempty, x) (u, f) (v, x) = (u `mappend` v, f x) はMonoidが出てきます。今までかかわったことがなかったのですが、定義を見てみ…

Applicativeの変わった仲間たち

Applicativeネタ、つきません...ほかにも見るところ、いっぱいあるんですが…ということで、コレハ、いったい、どう読めば良いのでしょう: instance Applicative ( (->) a) where pure = const () f g x = f x (g x) instance Monoid a => Applicative ( (,)…

リストの自由度

Haskellのリストの自由度のこと、ちょっと見直してみました。 リストの決まりごとは:同じ型の要素しか保持できない。 [1, 2, 3] -- ok [1, 'a', 3.4] -- NG 逆に、型が同じであればいくつあってもかまわない。 [ ], [1], [2, 3], [1..] :: [Int]この2つの…

Applicativeを使ってみる

ということで、まだまだ先はありますが、Applicativeの使い方が少し見えてきました。mapでこうやることが: map (+ 1) [1, 2, 3] = [2, 3, 4]Applicativeだとこうできる: pure (+1) [1, 2, 3] = [2, 3, 4]いくつのリストを対象に関数を適用するかで、map = …

Applicative勉強中:Applicativeとモナド

昨日はリストへの関数適用からApplicativeパターンを見つけるところまでやりました。でも、GoFもいうように、パターンといわれるからには、あちこちで似たような用例が見つからないとおかしいですよね...論文では、リストのほかにモナドも例として取り上げて…

Applicative勉強中:Applicativeパターン

さて、昨日のtransposeなのですが、 transpose :: [ [a ] ] -> [ [a ] ] transpose [ ] = repeat [ ] transpose (xs : xss) = zipWith (:) xs (transpose xss) これは、つまりtranspose [ [1, 2, 3], [4, 5, 6] ]を [1, 2, 3] `zipWith (:)` [4, 5, 6] `zipW…

Applicative論文で見かけたもの その2

本題のApplicativeからはちょっと離れるのですが、ひきつづき、Applicativeの論文で見かけたもののことを書きます。導入部の例として、行列の転置、Transposeが取り上げられていました。そのインプリメンテーションがかっこいいので思わずうなってしまいまし…

Applicative勉強中

ちょっと前から、時間を見つけてはApplicativeについての論文を読んでいます。まだいくつか(も)疑問点が残っているので、まだまだ説明はできないのですが、いくつか面白いことが出ていたので...小出しに書いていこうと思います。概要としては、Applicative…

ポスト内のコードが化ける...

最近気づいたことなのですが、どうやらコード内で空リスト[ ]や[ [ ] ]などがあると、何かほかのものに変換されてしまうようです。気がついたときは間にスペースを入れるようにしているのですが、忘れます。はてな記法一覧を見るとはてなリンクの強制解除と…

ちょっと変わったリストのトラバースはunfoldrでできる

昨日作ってみたvarMapなのですが、コメントでData.List.unfoldrの存在を教えてもらいました。 unfoldr :: (b -> Maybe (a, b)) -> b -> [a] unfoldr f b = case f b of Just (a,new_b) -> a : unfoldr f new_b Nothing -> [] ということで、unfoldrの入力は…

ちょっと変わったリストのトラバース

Haskellではmapとかfoldl, foldrとか先日のポストへのコメントで教えてもらったmapAccumLやモナドを使ったmapMなどいろんなリストのトラバースの仕方が提供されています。のですが、試しに書いていたCUIのTicTacToe(マルバツですね)のなかで、ライブラリに…

MonadIOクラスのこと

昨日のモナドトランスフォーマーの勉強中に使ったliftIOですが、勘違いをしていたことにやっと気がつきました。liftIOの型情報は liftIO :: IO a -> m a と、この関数だけ見るとIOアクションをほかのどんな形のモナドにでも挿げ替えてくれるハッキーな関数の…

モナドを重ねる

えー、今日はモナドトランスフォーマーの一種StateTについて勉強してみました。参考にしたのはここら辺です。モナドは実際に行われることの一つの面についての上手に抽象化してくれるのですが、一つ一つのことが別々のモナドで実現されているので、ステート…

ITPro連載:本物のプログラマはHaskellを使う

こちらのshelarcyさんによる連載、僕にはとてもためになってます。あちこち調べまわってゴリゴリ考えてHaskellを解き進むのもそれはそれで面白いのですが、こちらでは網羅的に、でも実用の妨げになる端折りもなくHaskellのことが説明されているように思いま…

コンテキストつきmapとStateモナドのこと

[a]があって、それにある関数 f :: a -> b -> (c, b) をマップして[c]を得たい。ここで、bはマップ開始時の初期値は決まっているけど、それから先はマップの各回によって新しいbの値が生成される。こんなようなコードを書く必要があるときがありました。き…

モナドと実行順序のこと、結末

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…