Skip to content
oraccha edited this page Jan 14, 2013 · 1 revision

純粋な関数型言語として設計された言語のようです.

  • [http://haskell.org/ 本家]
    • [http://www.haskell.org/haskellwiki/Hitchhikers_Guide_to_the_Haskell Hitchhikers guide to Haskell]
  • お,[http://www.haskell.org/hawiki/ Wikiのページ]がある. HaskellじゃなくてPythonで作られたpyWiki使ってますが.
  • [http://haskell.org/hoogle/ Hoogle] . HaskellのAPI検索エンジン.

1987 年の FPCA (Functional Programming Languages and Computer Architechture) において,関数プログラミングの標準言語となるべくして提案された.その名前は論理学者の Haskell B. Curry に由来している.

Haskell の特徴

  • 高階関数 (higher order function)

  • 遅延評価 (lazy evaluation) / 非正格性 (non strictness)

  • データ抽象化と強い型付け

  • パターンマッチング

  • 多様型 (polymorphism) / 多義性 (overloading) . 多様型を持つ関数は引数の型によらず同じように働き,多義性を持つ関数は引数の型毎に異なる振る舞いをする.

  • 関数的入出力システム . モナド (Monad).参照透過性(referential transparency)を維持したまま入出力を実現している.

    • 参照透過であるとは,同じスコープで関数呼出しの結果が同じであること.つまり(再)代入や入出力の副作用を受けないことを意味する.後者のための仕組みがIOモナド.
  • リスト/配列の内包表記 (list/array comprehension)

    • [http://ja.wikibooks.org/wiki/集合論 集合論]の外延的記法と内包的記法に由来しているんだよな。
    • 例えば,次のような感じ. {{{ [ x*x | x<-[1..100], odd x ] }}}
  • モジュール機能

有名な実装としては,[http://www.haskell.org/hugs/ Hugs] インタプリタと [http://www.haskell.org/ghc/ GHC] コンパイラが存在する.


関連ページ

  • Tiki:Haskell

    • 遅延評価と無限リスト.遅延評価を Unix Pipe のメタファで説明するのは,わかりいいかも.
  • [http://www.sampou.org/haskell/ Programming in Haskell]

  • [http://www.macs.hw.ac.uk/~sebc/hOp/ hOp] . マイクロカーネルベースの OS だそうな.ML/OS は OSKit 使っていたけど,これはどんな実装だろう.純粋な関数型言語で副作用の塊である OS をどのように実装するかは興味があるところ.

    • [http://etudiants.insia.org/~jbobbio/hOp/ hOp : dev lOg]
  • [http://programatica.cs.pdx.edu/House/ House] . h0p は開発が終了したようで,実質的にHouseが研究開発を引き継いでいる感じなのかな?ウィンドウシステムやネットワーキングも動いているようだ.

    • [http://ogi.altocumulus.org/~hallgren/ICFP2005/ A Principled Approach to Operating System Construction in Haskell] (ICFP2005)
  • [http://xmonad.org/ xmonad] . タイリングウィンドウなウィンドウシステム。

  • [http://slashdot.jp/article.pl?sid=05/06/15/060223&topic=31 モナディウスはパロディウスの夢を見るか?] (SlashdotJapan 2005-06-15)

  • [http://www.willamette.edu/%7Efruehr/haskell/evolution.html The Evolution of a Haskell Programmer] . factorial をどう書くか?

  • Pugs

  • [http://mono.kmc.gr.jp/~oxy/hiki.cgi?rtype rtype] . Haskell で実装された ruby インタプリタ.

  • [http://oss.timedia.co.jp/index.fcgi/kahua-web/show/Haskell/SICP SISP 一風変った Haskell プログラミングλ門]

  • [http://d.hatena.ne.jp/m-hiyama/20060419/1145432492 世界で一番か二番くらいにやさしい「モナド入門」] (檜山正幸のキマイラ飼育記 2006-04-19)

  • [http://halogen.note.amherst.edu/~jdtang/scheme_in_48/tutorial/io.html Write Yourself a Scheme in 48 Hours]

  • [http://www.shido.info/hs/index.html Haskell のお勉強]

  • [http://haskell.g.hatena.ne.jp/hyuki/ 結城浩のHaskell日記]

  • 本物のプログラマはHaskellを使う (ITpro) . shelarcy さんの連載記事.

    • [http://itpro.nikkeibp.co.jp/article/COLUMN/20060801/244812/ 第1回 関数型プログラミングの世界へようこそ] (2006-08-02)
  • [http://builder.japan.zdnet.com/news/story/0,3800079086,20363007,00.htm Haskellクイックスタート] (ZDNet 2007-12-13) . map、filter、fold関数。

情報処理学会の会誌で Haskell プログラミングの連載が始まった.第一回は和田先生,第二回は山下さん.

  • [http://www.ipsj.or.jp/07editj/promenade/4604.pdf 関数プログラミングの妙味]

青木さんの新著は,[http://i.loveruby.net/d/20051129.html#p01 『ふつうの Haskell プログラミング』]だそうな... 山下さん監修.

  • [http://i.loveruby.net/ja/stdhaskell/ 『ふつうのHaskellプログラミング』サポートページ]

向井さんの「入門Haskell」が先に出た.

  • [http://blog.livedoor.jp/dankogai/archives/50447960.html Haskellで一番難しいのは] (404 Blog Not Found 2006-04-08)
    • ↑余談だが、こういう便利な道具をXUL使わないと書けないのだとしたら残念なことだ。

よく出てくる例にクイックソートがこんなに簡単に書けるというのがあります. う〜む.ぱっと見よくわからなかったが.

クイックソートは再帰を使うときれいに書けるので,関数型言語の得意とする ところである. {{{ qsort [] = [] qsort (x:xs) = qsort elts_lt_x ++ [x] ++ qsort elts_greq_x where elts_lt_x = [y | y <- xs, y < x] elts_greq_x = [y | y <- xs, y >= x] }}}

一行目では空のリストを用意している. . 二行目以降では引数として与えられたリストの先頭の要素をx,残りをxsとし, xsを二つの部分リストに分割し,それぞれqsortを再帰的に呼出し,その結果を xを中心に連結している. この際,xsの要素がxより小さい場合はelts_lt_xというリストに, x以上の場合はelts_greq_xというリストに要素が加えられる.

  • [y|y<-xs,y<x] というのは,リストの内包表現(list comprehension)と呼ばれ, 与えられたリスト(xs)から要素(y)を生成し,テストし(y < x),変換する(今回はそのまま) ことによって新しいリスト(elts_lt_x)を定義する仕組みである. この場合は,filter関数の別表記と考えればよい.
  • ''++''はリストを連結する演算子である.

もっと素直に読む事もできる.

  • [ ](空リスト)を qsort した結果は [ ] である.
  • あるリスト (x:xs) に対して,qsort (x:xs) は (qsort elts_lt_x) と [x] と (qsort elts_gt_x) をこの順番に連結したものである.
    • ここで elts_lt_x は y < x なる xs の要素 y のリスト.
    • 同様に elts_gt_x は y > x なる xs の要素 y のリスト.

上記のように,引数が空リストであるときの定義と x:xs のときの定義をわけて書くことができる.また,関数本体で引数リストの car を x,cdr を xs として利用できる.これを引数のパターンマッチと呼ぶ.

Clone this wiki locally