タグ

ブックマーク / kazu-yamamoto.hatenablog.jp (13)

  • 制約プログラミングのススメ - あどけない話

    IIJ 社内でやったチュートリアル 純粋関数型言語Haskellの紹介 〜制約プログラミングのススメ〜 の資料を公開しました。

    制約プログラミングのススメ - あどけない話
  • Haskellには副作用がないのか? - あどけない話

    ある人は、Haskell には副作用がないと言う。また、別のある人は Haskell には副作用があると言う。Haskell を学ぶ者にとって、こういった意見のい違いが、Haskell を得体の知れない言語にし、学習の障壁となっているかもしれない。そこで、この記事では、なぜこのような意見の相違が生まれるのかについて説明したいと思う。 向心力か遠心力か? 僕は高校三年になって受験勉強をするまで、物理の運動方程式が得体の知れないものに思えていた。 例として円運動を考えよう。ある説明では、円運動をしている物体には向心力が働いていると説明されている。また別の説明では、遠心力が働くと説明されている。一体、どういうことだろう? 受験勉強でたくさんの問題を解いて、ようやく分かった。これらの説明はどちらも正しい。すなわち、観測者がどこにいるかによって、説明の仕方が異なるのだと。 観測者が円運動をする物体

    Haskellには副作用がないのか? - あどけない話
  • 遅延評価とIO - あどけない話

    僕は今、プログラマーとしての幸福感に満たされている。遅延評価を習得できたと思えるからだ。 遅延評価 なぜ関数プログラミングは重要かには、遅延評価の利点を以下のように説明している。 停止条件はループの体とは切離すことができ、強力なモジュール化が可能となる。 例として載っている「ニュートン-ラプソン法による平方根」は、若干難しいので、簡単な別例を示そう。Haskell には、第一引数の数だけ、第二引数を繰り返す関数 replicate がある。 > replicate 3 'a' → "aaa" これを普通に実装するとこうなる。 replicate 0 c = [] replicate n c = c : replicate (n-1) c Haskell 以外で実装する場合、きっとループを使うだろう。ただ、ここでは再帰かループかは問題ではない。 問題は、「結果を作る仕事」と「終了条件を判断

    遅延評価とIO - あどけない話
  • リストモナドの動作原理を考える - あどけない話

    Haskell のリスト内包表記はとっても便利です。あまり意味がないのですが、よく出される例は、こんな感じです。 [(x,y)|x<-[1,2],y<-[3,4,5]] → [(1,3),(1,4),(1,5),(2,3),(2,4),(2,5)] このように、このリスト内包表記は、あたかも二重のループであるかのように動きます。 リスト内包表記は、実は糖衣構文であり、do に直すと以下のようになります。 do x<-[1,2] y<-[3,4,5] return (x,y) → [(1,3),(1,4),(1,5),(2,3),(2,4),(2,5)] 僕は、この意味をずっと理解できませんでした。 "<-" は、モナドという箱の中から、中身を取り出します。たとえば、Just "str" から中身を取り出すと "str" となるように、Maybe モナドを理解するのは簡単です。 でも、リスト

    リストモナドの動作原理を考える - あどけない話
  • 正規表現を超える - あどけない話

    まずは、Audrey さんが言った Haskell の殺し文句を思い出して頂きたい。 正規表現ベースのパーサはメンテナンスしにくいのに気づいた? Parsec を使って 15分で Perl6 の完全なパーサを書く方法を勉強しましょう。 15分というのは誇張が入っていると思うが、正規表現が保守しにくく、Haskell の Parsec は強力で保守し易いのは事実だ。その理由を Perl と Haskell のコードを示しながら説明してみたいと思う。 Perl を愛する方に:この記事は Perl を攻撃するために書いたのではない。Perl を選んだのは、正規表現を広めた言語であり、僕がそれなりに Perl のコードを書けるためである。この記事の目的は、正規表現よりも関数型パーサー(Parsec)の方が優れていると示すことだ。 例題 この記事では例題として、IPv4 アドレスを解析する関数を書く

    正規表現を超える - あどけない話
  • 実践的な Haskell の本 - あどけない話

    Perl6 は何年経っても正式にリリースされません。そんな Perl6 を Audrey Tang さんは、たったの数ヶ月で作りました。その実装は Pugs と呼ばれています。短期間の開発を可能にした秘密兵器は Haskell です。 その Audrey さんが、2006年に日で Haskell について説明してくれました(資料)。残念ながら、そのころの僕は Haskell に興味がなかったのでチュートリアルは受けていませんが、その概要にはこう書かれています。 コーナーケースを探すのにユニットテストを書くのに疲れた? QuickCheck を使ってコンピュータに書かせちゃいましょう。正規表現ベースのパーサはメンテナンスしにくいのに気づいた? Parsec を使って 15分で Perl6 の完全なパーサを書く方法を勉強しましょう。デッドロックやレースコンディションはもううんざり? STM

    実践的な Haskell の本 - あどけない話
  • 最高のHaskell入門書 - あどけない話

    輪講で「Programming in Haskell」をようやく読み終えました。このは、最高のHaskell入門書といって間違いないでしょう。 Programming in Haskell 作者: Professor Graham Hutton出版社/メーカー: Cambridge University Press発売日: 2007/01/18メディア: ペーパーバック購入: 2人 クリック: 67回この商品を含むブログ (22件) を見る 一緒に Haskell のを何か読もうという話が、友達との間で出たとき、最初は「The Craft of Functional Programming」にしようかと思っていました。ただ、出版社の人から「Programming in Haskell」を勧められたことがあったので、二冊を友達に提示したところ、直感で「Programming in Has

    最高のHaskell入門書 - あどけない話
  • Haskellの多相性 - あどけない話

    パラメータ多相(parametric) 型のパラメータ化。静的。 length :: [a] -> Int length [] = 0 length (x:xs) = 1 + length xs C++のテンプレート Javaのジェネリックス アドホック多相(ad-hoc) 型によって、異なる振る舞いを示す。静的。 class Shape a where display :: a -> String data Triangle = Triangle deriving Show instance Shape Triangle where display _ = " * \n" ++ " * * \n" ++ "*****\n" data Rectangle = Rectangle deriving Show instance Shape Rectangle where display _ =

    Haskellの多相性 - あどけない話
  • Haskellチュートリアル - あどけない話

    先週、僭越ながら Haskell チュートリアルをやりました。その資料を公開します。 Haskell プログラミング 〜 純粋関数型言語への誘い〜

    Haskellチュートリアル - あどけない話
  • すご過ぎるとおもちゃに見える - あどけない話

    「達人プログラマー」の14ページでは、「毎年少なくとも一つの言語を学習する」ことが提案されています。 達人プログラマー―システム開発の職人から名匠への道 作者: アンドリューハント,デビッドトーマス,Andrew Hunt,David Thomas,村上雅章出版社/メーカー: ピアソンエデュケーション発売日: 2000/11メディア: 単行購入: 42人 クリック: 1,099回この商品を含むブログ (347件) を見るこの大切さを雄弁に語っているのは、「普通のやつらの上を行け」の『「ほげ言語」のパラドックス』です。(「ほげ」の部分は、もっと適切な単語に訳して欲しかったです。。。) 小賢しい人は、「ほとんどの言語はチューリング完全だ」だと反論します。そのとき、「じゃぁ、全部アセンブラで書けば」と感情的に言い返すことはできても、客観的に諭すことは僕にはできませんでした。 その答えを見つけた

    すご過ぎるとおもちゃに見える - あどけない話
  • Haskell の 4 つの糊 - あどけない話

    なぜ関数プログラミングは重要かでは、糊の重要さが強調されています。 問題を解くための部品プログラムを書くとき、その問題を部分問題に分割し、部分問題を解き、その解を合成する。元の問題を分割する方法は、部分解を張り合せる方法に直接依存する。それゆえに、概念的には問題をモジュール化する能力を高めるためにはそのプログラミング言語のなかで新たな糊の類を用意しなければならない。... 糊の重要性は、大工仕事との類比によって、正しく評価できる。椅子は、部分(座部、脚、背もたれなど)を作り、それらを正しくくっつけ合せることで容易に作ることができる。しかし、これはジョイントと木を張り合せるという能力に依存する。その能力がなければ、椅子を作る方法はひとつ木の塊からそれを彫り出す以外なく、非常に難しい作業になる。この例は、モジュール化の強大な力と正しい糊を持つことの重要性の両方を例示するものである。 僕が思うに

    Haskell の 4 つの糊 - あどけない話
  • Haskell vs OOP - あどけない話

    「Why Haskell matters?」(なぜ Haskell は重要か?)には、Haskell とオブジェクト指向プログラミングを比較した章があります。日語訳が見当たらなかったので、必要な部分を訳してみます。 オブジェクト指向プログラミングの優れた利点は、データとそれに作用する関数を一つのオブジェクトにまとめられることではない。優れた利点、それは、(実装からインターフェイスを切り離せる)データのカプセル化と、(型の一群の振る舞いを同じようにする)多相性だ。しかしながら、データのカプセル化と多相性は、OOP の専売特許ではない! いやぁ、心洗われる文章です。:-) データのカプセル化 Haskell でのデータのカプセル化は、それぞれのデータ型をそれぞれのモジュールで宣言し、そのモジュールからインターフェイスだけを公開することで実現できる。モジュール内部には、内部データに触れる関数群

    Haskell vs OOP - あどけない話
  • 状態モナド遊び - あどけない話

    状態をモナドで実現する方法を考えます。 リスト 例は簡単な方がいいので、データ構造として Lisp 風のリストを定義しましょう。 data List a = Nil | Cons a (List a) deriving Show リストは、こんな風に表せます。 Cons "c" (Cons "b" (Cons "a" Nil)) Lisp 風の cons も定義してみましょう。 cons :: a -> List a -> List a cons x xs = Cons x xs cons "c" $ cons "b" $ cons "a" Nil → Cons "c" (Cons "b" (Cons "a" Nil)) 状態を持つリスト さて、この Lisp 風のリストに、要素の数を覚えさせておきたいとしましょう。もちろん、数えれば分りますが、数えなくても一瞬で分るようにしたいのです。

    状態モナド遊び - あどけない話
  • 1