タグ

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

  • Haskellの講義に関するQ&A - あどけない話

    岡山大学で、関数プログラミングの講義を一コマ担当しました。資料は、函数プログラミングの集いで使った関数プログラミングの道しるべを流用しました。ちゃんと用意しなくて、講義を受けた学生には申し訳ないです。 講義内容に関して質問を頂きました。同じような疑問を持つ人も多いと思いますので、担当教官の許可を得てここに公開します。 永続データプログラミングの意義は分かったが,破壊しないと効率が悪いのではないですか.配列のような構造が世の中には多い気がします.メモリは足りなくなりませんか. 基的に永続と呼ばれているデータは、共有の効率が高く、しかも不要になった部分はすぐに GC に回収されます。また、GHC の GC はすごく優秀であることが知られています。 Haskell では、下位のレイヤーではデータを破壊できて、たとえば固定長のバッファーを使い回すといったことも可能です。ただ、それは普通のプログラ

    Haskellの講義に関するQ&A - あどけない話
  • HaskellとDSL - あどけない話

    LL Planets の「メタプログラミングの光と闇」で Haskell について話してきました。PerlPythonRuby が概ね内部 DSL を作る話だったのに対し、Haskell では外部DSLを内部に埋め込むという話をしました。短い時間で説明不足になった感があるので、この記事で二点ほど補足します。 Haskell では文法がうまく設計されており、コードを書けば自然とDSLっぽくなるので、わざわざ内部DSLなんて言わない。それよりもコンビネータという考え方を学ぶ方が新しい視野がひらけてよい。 Haskell ではパーサーを作るのが簡単。だから自分で言語を作るのも簡単。その言語を外部ファイルから読み込んでもいいし、HERE DOCUMENT のように内部に貼付けることもできる。 関数を二項演算子として扱う Haskell では関数をバッククォートで囲むと二項演算子になります。 i

    HaskellとDSL - あどけない話
  • Haskell(GHC)での軽量ユーザスレッドの実装方法 - あどけない話

    命令型言語の JavaRuby がユーザスレッドからカーネルスレッドに移行したのとは対照的に、関数型言語の Erlang や Haskell では軽量なユーザスレッドを提供することに成功しています。僕は、この違いが何から生じているのか理解したいと思っています。この記事では、これまで調べたことをまとめます。 軽量なユーザスレッドは Erlang が有名ですが、Haskell (GHC)でも利用できることを重ねて強調しておきます。Haskell の方が Erlang よりも速いようです。追記:フェアな比較ではないようなので、話半分で参照して下さい。 Rubyの場合 Ruby 1.8 まで提供されていたユーザスレッドは、軽量とは言えませんでした。その理由は、ユーザスレッドをコンテキストスイッチさせる際にスタックをコピーしていたからです。Rubyソースコード完全解説の第19章 スレッドによれ

    Haskell(GHC)での軽量ユーザスレッドの実装方法 - あどけない話
  • 使ってみよう 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 から見た node.js - あどけない話

    誤訳 以前、「サーバサイドJavaScriptのNode.js、最初はCやHaskellを検討し失敗。開発者ライアン・ダール氏へのインタビュー」という記事が twitter で話題になっていました。 ―― なぜJavaScriptを選んだのでしょう? ダール氏 実は最初は違いました。最初はC、Lua、Haskellなどで失敗していました。そんなときV8(Chromeが採用しているJavaScriptエンジン)に気がついて、やろうとしていることに対してJavaScriptが完璧な言語だと突然ひらめいたのです。 ただでさえ、Haskell は遅いと誤解されているのに、このような悪意さえ感じらえる訳だと、さらに誤解が深まりそうです。原文にはこう書かれています。 Dahl: Originally I didn’t. I had several failed private projects doi

    Haskell から見た node.js - あどけない話
  • Haskellの開発ツール (2011年版) - あどけない話

    Haskell開発に関係するツールをとりとめもなく列挙してみます。 エディタ/IDE 僕は、Emacs と haskell-mode と ghc-mod を組み合わせて使っています。haskell-mode は、行頭揃えの機能がしょぼいので、作り直したいと思っています。 IDE のバックエンドとしては、scionがありますが、使ったことがないので説明できません。(僕は ghc-mod で十分だと思っているので。) Leksah とか yi とかも聞きますが、使ったことがないので知りません。(いや、yi はちょっと使ったことがありますけど。) 興味のある人は自分で調べて下さい。 マニュアル 関数のマニュアルが読みたくなったら、GHCについてくるモジュールの一覧とhackageDBから探して下さい。ghc-mod を使っていれば、一発でブラウザに表示できます。 探すのが面倒なら、google

    Haskellの開発ツール (2011年版) - あどけない話
  • Yコンビネータのまとめ - あどけない話

    不動点 関数 f :: a -> a に対して、f x == x となる x を「関数 f の不動点」という。 もし、関数 f を入力として取り、関数 f の不動点を返す関数 Y があるとすれば、関数 f の不動点を Y f と表現できる。 ここで、Y の型を調べる。引数 f の型は a -> a、Y は不動点を返すから返り値の型は a。よって、Y :: (a -> a) -> a となる。 不動点 x = Y f を f x == x に代入すると、Y f == f (Y f) となる。これを Haskell で実装すると、関数名に大文字が使えるとして、以下のようになる。 Y x = x (Y x) これを不動点コンビネータと呼ぶ。 再帰の例 再帰するときに自分の関数名を使わない階乗のプログラム fact を以下のように定義する。 fact :: Num a => (a -> a) ->

    Yコンビネータのまとめ - あどけない話
    nbqx69
    nbqx69 2010/06/02
  • 1