タグ

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

  • 静的型付き言語プログラマから見た動的型付き言語 - あどけない話

    およそ20年前にAlan Kay の講演をきいたことがある。印象に残ったのは、彼が引き合いに出した McLuhan の言葉だ。 I don't know who discovered water, but it wasn't a fish. (拙訳)誰が水を発見したかは知らないが、発見者が魚でなかったことは確かだ。 誰しも信念という水の中を泳ぐ魚のような存在だ。思い切って飛び跳ね空気に触れてみなれば、自分が信念という水の中にいることに気付かない。 ある手法の利点を語るには、その手法の欠点や、他の手法の利点や欠点とできるだけ客観的に比較しなければ説得力がない。ただ、これを実践するのは難しい。この記事では、客観的になれているか自問自答しながら、動的型付き言語と静的型付き言語について比較してみようと思う。 僕は静的な C 言語から、動的な Perl、Lisp、JavaScript を経て、現在で

    静的型付き言語プログラマから見た動的型付き言語 - あどけない話
  • なぜConduitなのか? - あどけない話

    Iteratee という概念は、Haskell 界に適切な資源管理と合成可能な IO をもたらした。そして、以下の3つのパッケージが乱立することになった。 iteraee enumerator iterIO 昨年の ICFP の際、Iteratee の生みの親である Oleg さんに「この状況をどう思っているのか」と聞いてみた。曰く「とてもよい状況です。いくつかの実装が現れ実際に使われることで、当に必要な機能が分かるでしょう」。 もしかすると、Conduit によって彼の願いがもう実現されたのかもしれない。 Iteratee には何が足らなかったのか? 以下は、enumerator の使用経験基づく考察だが、たぶん Iteratee 全体に言えると思う。 Iteratee で資源を割り当てられない Michael Snoyman さんの不満 例外処理が大変 liftIO と catch

    なぜConduitなのか? - あどけない話
  • 使ってみよう Enumerator - あどけない話

    Enumerator Package - Yet Another Iteratee Tutorialは、Iteratee: 列挙ベースのI/Oよりは分かりやすいのですが、やっぱりよく分かりません。なぜなら、僕は使い方を知りたいのに、作り方が書いてあるからです。そこで、Enumerator ライブラリの使い方を簡単に紹介します。 登場人物 Iteratee 入力をもらって計算をします run_ で実行します IO モナドが指定されていれば、副作用を起こせます オートマトンと考えると分かりやすいです Iteratee 同士は (>>=) で合成できます Iteratee >>= Iteratee → Iteratee Enumerator Iteratee と ($$) で合成することにより、新たな Iteratee になります Enumerator $$ Iteratee → Iterate

    使ってみよう Enumerator - あどけない話
  • 遅延評価だけだと出力の順番が定まらない例 - あどけない話

    Haskell に関してよく見かける説明は、おおむね次のような感じだ。「遅延評価では、その値が必要になったときに初めて評価されるので、順番が大切な入出力とは相性が悪い。」 Haskellの入出力は、基的にIOモナドを使用しないと扱えない。IOモナドは、入出力の順番を制御してくれる。だから、遅延評価は入出力と相性が悪いと言われても、実際相性の悪い例題は示せないので、納得できない。 この問題を長い間考えていたが、昨日ひらめいた。Haskellでは純粋な関数にIOを忍び込ませることは、基的にはできないけれど、裏技がある。Debug.Traceで定義されている trace がその掟を破る。 trace は第一引数を出力し、第二引数を返す関数である。出力するにも関わらず、関数の型にはIOは現れない。 trace :: String -> a -> a trace string expr = un

    遅延評価だけだと出力の順番が定まらない例 - あどけない話
    j5ik2o
    j5ik2o 2010/12/20
    遅延評価だけだと出力の順番が定まらない例 - あどけない話 -
  • 関数型プログラミングと代入 - あどけない話

    関数型プログラミングでは、よく「代入は使ってはならない」と言われます。関数型言語の一種である Emacs Lisp を生業とする僕は、この言葉に長年悩まされてきました。代入を使わないで実用的なプログラムを書くことは無理だからです。 もちろん、問題の内容が数学の関数に類似したものなら、代入も副作用もないプログラムを書くことは簡単です。階乗(factorial)のコードは、以下のように奇麗に実装できます。 (defun factorial(n) (if (= n 1) 1 (* n (factorial (1- n))))) しかし、こう書けることと、実際にこう書くかということとは別問題です。 Scheme のように末尾最適化を実装していて、末尾再帰をループに変換してくれるなら、上記を末尾再帰に変換したコードを書くでしょう。 しかし、Emacs Lisp には末尾最適化がありませんから、スタッ

    関数型プログラミングと代入 - あどけない話
    j5ik2o
    j5ik2o 2010/12/05
  • 1