Thursday 1 August 2013

Haskell 入門! (1)

Haskell is an advanced purely-functional programming language. An open-source product of more than twenty years of cutting-edge research, it allows rapid development of robust, concise, correct software. With strong support for integration with other languages, built-in concurrency and parallelism, debuggers, profilers, rich libraries and an active community, Haskell makes it easier to produce flexible, maintainable, high-quality software. -- http://www.haskell.org/
Haskell, 勉強してみようぜ.

…と思ったので,en.wikibooks.org の Haskell を 読み始めました.

Haskell
  • 純粋関数型言語.なんかかっこいい.かっこ良さそう.
    • 「関数」っていうときにそれが指すのが数学で云う関数みたいなもの.
    • 参照透過性とか副作用がないとか.そのへんのために Input / Output はむしろ(本来的には)大変ややこしいことになる,とか.その辺とかに圏論が出てくるとか.いう噂.
  • a = 1 っていうのが代入じゃなくてほんとに a = 1 っていう意味らしい. a = 2 とあとで言い直したりできないらしい.かっこいい.
  • プログラミングスレまとめ いわく
    生産性が異常に高く、この言語でPerl6を数ヶ月で実装した人もいるほど。
    また、純粋関数型なので手続き型のC/C++とはまるで別世界の様相を呈している。
    例としては、手続き型言語にあるような変数がないこと、必要になるまで計算を遅らせる遅延評価という仕組みによって無限の長さのリストを扱えることなどが挙げられよう。
  • プログラミング言語/Haskell - プログラミングスレまとめ in VIPなんかは読むと興味が湧いてくる.
  • モナド?圏論?なんやてかっこよさそう.
  • Project Euler とかやってると Haskell でやりやすいんじゃね(知らんけど)っていうのが結構あったり.
そんな感じでしれっと読み始めたら,なんか思ってたよりずっと面白い.
と,いうわけで一回の中断を挟んで最初から再び読み進めてるんですが,
二回目でも丁寧さを失わないようにまとめを作りながら読んでいまして,
それをここに投げていくことにします.まだ途中までだしどこまで続くかわかりませんが.
内容的には wikibooks の抄訳 +α-β. wikibooks 読むつもりがおありなら多分読まないほうがいいと思います.

では第一回.インストールとかそのへんと最初の計算とかそのあたり.
以下は en.wikibooks の Haskell の pdf 版に基づいたもので,
ライセンスを継承して CC-BY-SA でお届けします.
なおコードの色付けには  markup.su : Online syntax highlighter like TextMate
を利用しました.

最初に覚えておいて欲しいのだけれど,Haskell, 関数型言語にあらせられるため,
普段知ってる言語とは随分趣が違います.
(そういえば ぴゅとん も関数型めいた書き方ができるようだし,map はじめ高階関数は Haskell のアイデアからとってきたものらしい)
だからこれまでのことは基本的に忘れて一からのつもりでやっていきましょう.
ちなみに Haskell は
  • 強い静的型付け
  • コンパイル型(ただし対話環境もある)
  • 純粋関数型
Haskell でいう関数はほとんど数学でいうところの関数の意味で,
関数の型は(型)から(型)への写像みたいな感じの型になる,とかそのへんわくわく.

ではよろしくおねがいします.

Getting set up
まずは haskell のインストール. Glasgow Haskell Compiler, GHC がおすすめ.
ちなみにこの GHC自体も Haskell で書かれてるらしい(だからソースから自分でビルドしようとするとめっちゃ苦労するらしい)
ubuntu とかなら
$ sudo apt-get update
$ sudo apt-get install ghc
でよい. コンパイラとともに GHCi (i for interacitve)という interactive environment がついてきます.
若干 python とかのインタープリタとは趣が違うんやけど,まあともかくこの人とお話していきましょう.
linux ならたとえば
$ ghci
GHCi, version 7.6.2: http://www.haskell.org/ghc/  :? for help
Loading package ghc-prim ... linking ... done.
Loading package integer-gmp ... linking ... done.
Loading package base ... linking ... done.
Prelude> 
というかんじ.かっこいいアスキーアートが出てくる例が多いみたいやけどなんか僕の環境では出てきません.
ここで loading package とかやってくれてますが,
これによって built-in functions や modules にはだいたいアクセスできる.
Prelude> は prompt ってやつで,ここにコマンドを書き込んでいく.prelude は普段から読み込まれてる基本パックみたいなもん(と今は思っていいんじゃないだろうか).

というわけで四則とかそのへん.まだすごくない.
Prelude> 2+2
4
Prelude> 5 * 4 + 3 
23
Prelude> 2^5
32
指数は ^で書くぜってあたり以外は特記事項なし.
...と思ってたら, ^(Integral b, Num a) => a -> b -> a .
(この記法の意味はしばらく先に出てきます.とりあえずは数なものと Integral なもの(こっちが第2引数)を受け取って数を返す(数学で言う)函数ってこと.)
例えば
Prelude> 2^1.2
はエラーを,
Prelude> 2^(-1)
は Exception を返してくるみたい.
こういうのも含めて指数を書くときは ** で.
Prelude> :t (**)
(**) :: Floating a => a -> a -> a
まとめると
Prelude> 2**(-1)
0.5
Prelude> 2**0.5
1.4142135623730951
Prelude> 1.0^2
1.0
これからお世話になる ghci はソースファイル読み込んだりとかもちゃんとできる優秀なひと,らしい.

今回は短いけど次回は関数と変数とか.
blog であることを活かして一回あたりは短くやっていこうと思います.

No comments:

Post a Comment