みどりねこ日記

よくわからないけど、頑張りますよ。

Haskellのdo記法(2)

do記法に変換するとき、下流に値を渡していく(>>=)演算子は何も渡さない(>>)演算子に比べてちょっとだけ難しいです。これらの値は<-記法により値を保管しておくことができ、do記法のなかの下流で参照することができます。

do
	result <- action
	another_result <- another_action
	(action_based_on_previous_results result another_result)

これをモナディックなコードに変えます。

action >>= f
	where f result = do
		another_result <- another_action
		(action_based_on_previous_results result another_result)
	f _ = fail "..."

言葉で言うと、doブロックの外に持ちだされたアクションの結果は引数をとる関数に結び付けられました。もしパターンマッチに失敗したら、モナドのfailが呼ばれます。

doブロック内の、<-の左にある変数はモナドから外れるので、例えばIO String型のアクションがあったとしたら、結果はString型と言うことになることに注意してください。