2010年3月14日0:04 Yukihiro Matsumoto <matz / ruby-lang.org>:
>
> それは私には弱い領域なので、正直なところ、それを必須にされる
> とメソッドの追加は難しいですね。ただ、HaskelやClojureにはあ
> るので、それなりに使える分野はあるのではないかと想像します。

最近、Practical API Design という本を読んでいたりするのですが、
API Reviews という節があって、いくつかの項目があげられているんですが、
やっぱりというかなんというか最初の項目がユースケースに基づいた API か
どうかという話で、まぁ、これは Ruby に限らず重要なわけです。
(この本の著者は NetBeans の人です。)

Clojure にいろいろとある機能のうち、interleave に注目した理由が
きっとあるはずで、それを書けばいいと思うんですが難しいですかね。

もちろん提案者以外のひとがユースケースを提供してもいいんですが、
私にはちょっと想像力が及びませんでした。

想像力の代わりに検索力を使うと、
Clojure の interleave の説明にはユースケースは書いてないようです。
http://richhickey.github.com/clojure/clojure.core-api.html#clojure.core/interleave

Haskell にあるという定義は見つかりませんでした。
どこにあるんでしょう?

さらに検索していくと、join を一般化したような話ですかねぇ。
http://en.wikibooks.org/wiki/Clojure_Programming/Getting_Started
の (interleave completions (repeat "\n")) とか。

それなら join を使えよ、という気もしますが、join と比較すると
* 最後の要素の終わりにもつけられる
* 区切りを複数種にできる
* 文字列以外にも使える
というあたりが利点になるでしょうか。

["A", "B", "C"] から "A\nB\nC\n" や "A,B,C," を生成したいことは
何回もあった覚えがあるので、
それが
  ary.interleave(["\n"].cycle).join
あるいは
  ary.interleave(["\n"]*ary.length).join
と書けるようになるのはうれしい、かなぁ?
文字列にするには結局 join が必要だし、
ちょっと長すぎてこの用途を考えるならそれ専用のものを別に考えたくなりますが。

また、検索していると、上述の例もそうなんですが、
引数に (repeat "\n") のようなのが与えている例がけっこうあって、
それなら区切りを複数種にできるという点が実際に役に立つのは
じつは稀なのかも、という疑いも感じます。

> zip同様、Enumerable(to_enumでEnumeratorを返すもの全般)を受け
> 付けます。

さらに思ったんですが、
interleave の引数に cycle 等の無限リスト、あるいはレシーバよりも長いものを
与えたときにはどうなるんでしょうか。
-- 
[田中 哲][たなか あきら][Tanaka Akira]