関数型言語的JavaScriptにトライ

Haskell本を読んで関数型言語の考え方がなんとなくわかってきたので、
JavaScriptでそれができないか試してみる。
まずは簡単な計算機。

<html>
<head>
	<title>calc</title>
	<script type="text/javascript" src="prototype-1.4.0.js"></script>
	<script type="text/javascript">
	//演算(項1、項2)を評価して項1、tに代入、次の演算をセット
	var calc = {
		'=' : function(a){ return function(b){ return a = b; }},
		'+' : function(a){ return function(b){ return (a - 0) + (b - 0)}},
		'-' : function(a){ return function(b){ return a - b; }},
		'*' : function(a){ return function(b){ return a * b; }},
		'/' : function(a){ return function(b){ return b == "0" ? 0 : a / b; }}
	};
	// 数字押したとき。追記するか上書するか
	var set1 = function(a){$('t').value=a; num = set2 };
	var set2 = function(a){$('t').value = $F('t').concat(a); };
	var num = set1;

	var fnc = calc['+'](0);
	// 演算子押したとき。
	function exec(s){
		a = fnc($F('t') - 0);
		fnc = calc[s](a);
		$('t').value = a;
		num = set1;
	}
	</script>
	<style type="text/css">
		@import url(calc.css);
	</style>
</head>
<body>
	<div id="div_root">
		<input type="text" id="t" value="0" />
		<div id="div_buttons">
			<div id="div_numbers">
				<input type="button" class="button" value="1" onclick="num(this.value)" />
				<input type="button" class="button" value="2" onclick="num(this.value)" />
				<input type="button" class="button" value="3" onclick="num(this.value)" />
				<input type="button" class="button" value="4" onclick="num(this.value)" />
				<input type="button" class="button" value="5" onclick="num(this.value)" />
				<input type="button" class="button" value="6" onclick="num(this.value)" />
				<input type="button" class="button" value="7" onclick="num(this.value)" />
				<input type="button" class="button" value="8" onclick="num(this.value)" />
				<input type="button" class="button" value="9" onclick="num(this.value)" />
				<input type="button" class="button" value="0" onclick="num(this.value)" />
			</div>
			<div id="div_actions">
				<input type="button" class="button" value="+" onclick="exec(this.value);" />
				<input type="button" class="button" value="-" onclick="exec(this.value);" />
				<input type="button" class="button" value="*" onclick="exec(this.value);" />
				<input type="button" class="button" value="/" onclick="exec(this.value);" />
				<input type="button" class="button" value="=" onclick="exec(this.value);" />
			</div>
		</div>
	</div>
</body>
</html>

とりあえず関数志向に近づけたかっただけなので可読性度外視。
演算子をキーにした連想配列Haskellの引数マッチングぽくていいかなと思ったのだけどexec()は完全に手続き志向だし、コード全体に副作用が分散してていまいち。HaskellだったらIOモナドが分散させないだろうし、もうちょっと何とかならないものか。
まあ本日の余暇としてはこんなところで。