>>323
>>322 と比較すると:
・わざわざジェネレータで「組立てた」シーケンスを
 reduce で「畳み込んで」いて、二重のループになっているから処理効率(=性能)が悪く、
 なおかつ reduce へ渡すラムダ式が増えているからコードも複雑化してしまっている
・そもそも「Haskell の unfold 定義」に従って関数定義していないから
 その関数の命名 unfold は不適切であり、別の名前を考案すべき
 念の為に「Haskell の unfold 定義」を以下に示す(ただし末尾再帰ではなく一般再帰):
  unfold :: (B -> Maybe (A, B)) -> B -> [A]
  unfold f u = case f u of
          Nothing -> []
          Just (x, v) -> x : (unfold f v)
この「Haskell の unfold 定義」に従った unfold の Python 実装を以下に書いた:
  http://ideone.com/vpTBlR
  ・__unfoldl_string_rec__:一般再帰による実装(>>322 と同じ)
  ・__unfoldl_string_while__:while 文と破壊的代入を使った手続き型実装

あわせて Ruby の実装コードも更新した:
  http://ideone.com/9x6s0h
コードの要点を示す:
・Python のジェネレータを Ruby では外部イテレータ Enumerator と呼ぶが、
 (Ruby 1.9 以降のメソッド定義マナーに従い)ブロックが渡されていない場合には
 (組込みメソッド Object#to_enum を使って)外部イテレータを返すようにした
・3種類のメソッド定義を示した
 ・String#__unfoldl_rec__:一般再帰による実装(>>322 と同じ)
 ・String#__unfoldl_until__:until 文と破壊的代入を使った手続き型実装
 ・String#__unfoldl_loop__:メソッド loop を使った参照透明性のある関数型実装(>>264

最後に、Ruby と同様な「Haskell の unfold 定義」に従った
Python のジェネレータ実装については、>>323 への宿題としておく
(ML や Haskell といった静的型付け関数型言語に慣れていないと、難しいかもしれないが....)