2010-07-26 (月)
昨日の夜,プログラム書いていて,気づいたら寝ていた.
洗濯した洗濯物を洗濯機に入れっぱなしだったことを思い出して5時とかに目が覚めて洗濯物干したりする.眠い….
*Haskell
なんか,最近新しい言語触って無いので,ghcを入れてhaskell触ってみた.Hello, world的な簡単な計算をするプログラムは書いたことがあるけど,実はモナドも型クラスも良く分かってなかったので,今回は多少真面目に触りたい.
モナドの前に,純粋仮想関数言語が副作用をどう扱っているのかも気になったので,wikipediaを見たら,「コンピュータの現在の状態から次の状態を返す関数」なんていう恐ろしい記述があったのだけど,Haskellでは「>>=」を使って状態の中身を式の外に漏らすことなく,副作用を言語の外に追い出している…という理解でいいのかな?
関数型言語にはそんなに興味が無いのだけど,言語としては結構良いなぁ.色々なものが綺麗に書けるというのは良い.
ただ,BASICとかからプログラミングを始めたせいか,画面に何かが表示されたり,ネットワークにパケットを送出したり,時間が経過したりするという副作用こそがプログラミングの主体であって,それ以外は楽にコーディングするための付加機能だという感覚から抜け出せません.
逆に副作用だけを記述できるプログラミング言語とか無いのかな….最終的に副作用が無い計算はコンパイラに消されることが保障されて,同じ結果を出力するプログラムは同じコードにコンパイルされなければいけないような言語です.print命令くらいしか無い言語にすれば簡単ですが,まともに使える言語にするためにはコンパイラがかなりがんばらないとだな.具体的には,円周率を計算してある桁数printするプログラムは,print "3.1415926535..."と書いた場合と完全に等価であるべき.さらに,どんなに酷いアルゴリズムで実装しても,高速なアルゴリズムで実装した場合と同じ時間で処理されることが保障される.高速なアルゴリズムをわざと遅くするか,酷いアルゴリズムを高度に最適化してくれるのかは,コンパイラ依存.
というわけで,もう少しHaskell触ってみよう.