フローが重要か

そもそも処理とかロジックをフローとか手順といったもので考えるのが妥当なのか、という話もある。要するにフローが処理において重要なのかという話。実際、関数型言語では式の評価順序はほとんど規定していないわけで*1、フローもへったくれもない。じゃどうするかといえば、ある関数で必要なinputを別の関数で求めて、そのままそのoutputを関数にinputしてやればいい。たとえば、この間書いたpythonでのn-gramの頻度計算をさらに関数的にすれば

import itertools
import fileinput

def ngrams(s, n):
    return (s[i:i+n] for i in xrange(len(s) - n + 1))

def counts(seq):
    return ((key, iter_len(val)) for key, val in itertools.groupby(sorted(seq)))

def iter_len(it):
    return len(tuple(it))

def input_ngrams(fp, n):
    return itertools.chain(
	*(ngrams(line.rstrip(), n) for line in fp))

for key, val in counts(input_ngrams(fileinput.input(), 2)):
    print key, val

てな感じで、各関数にそもそもフローなんてない。最後の出力部分は繰り返しをしているけど。多分、フローチャートからこういうプログラムを考えることも、このプログラムからフローチャートを起こすことも難しいんじゃないかな。
要するに、手順は機能的な入出力の関係から結果的に決まるだけで本質的に重要ではないんじゃないかと。まぁ、入出力みたいに順序が重要な場面も結構あるんだけどもね。
ちなみにテストファーストが重要なのは、先にテストがあることがよりも、テストを書くことで仕様が固まるという副作用のほうだったりする。

*1:だから基本的に代入自体がない