Gauche > Archives > 2014/03/10

2014/03/10 00:09:51 UTCshiro
#
最短で切るinterleaveは ($ lconcatenate $ lmap list seq seq2 ...) で書けるのか。
2014/03/10 00:27:24 UTCshiro
#
消尽したseqを除いて続ける、というのはどちらかというとmergeという感じがする。しかしmergeと名乗ったら要素間の優先順位も指定したくなる気がする(merge sortからの連想)。
#
[a]->[a]な優先順位決定手続きを第一引数に取ることにすれば、消尽したseqを除いて続けるinterleaveは (merge list seq seq2 ...) でいいのか。sortutilのmergeと引数順が違うのが気になるが。
2014/03/10 00:45:33 UTComasanori@twitter
#
確かに(2)はinterleaveとは少し違う気がします。
(3)の埋め合わせはコレクション毎に違う値を設定するのでしょうか?そうでなければ(1)を基本にオプション引数を1つ用意すれば(3)も実現できると思います。
2014/03/10 00:50:04 UTCshiro
#
@omasanori 不定長引数にすると、オプション引数の置き場所が難しいなあと。確かにseqごとにフィラーを指定したい場合はあるな。
#
どれが短い可能性があるかわかってれば、lappendであらかじめフィラーの無限seqをくっつけておけるけど、どれが短いかわからない場合、全部にくっつけちゃうと結果も無限seqになるのでそれはそれで使い辛い
2014/03/10 00:54:36 UTCnobsun
#
むしろ全部無限seqでいいのでは?使う側で切り落せばいいかと。。。
2014/03/10 00:56:13 UTCshiro
#
使う側で「最後のひとつを使い尽くしたこと」の検出ができないんですよ (フィラーはフィラーで意味のある値を使いたい場合があるので)
#
Haskellのライブラリにinterleave的なやつってありますか?
2014/03/10 00:57:26 UTComasanori@twitter
#
確かに。埋め合わせにシーケンスを使いたい場合も考えられるから、シーケンスでなければ、というのも良い対処ではありませんし……。
2014/03/10 00:58:14 UTCnobsun
#
公平に採用するというものですか? > ここで議論しているinterleaveの仕様
2014/03/10 00:59:12 UTCshiro
#
はい。複数のストリームをラウンドロビンでマージする、という前提。使い尽くした場合の仕様をどうするか、が論点。
2014/03/10 00:59:32 UTCnobsun
#
(2)でいいなら、concat . transpose でできますが。。。
#
もちろん要素の型がすべて同じというHaskellの制約はあります
2014/03/10 01:02:21 UTCshiro
#
transposeはリストの長さが違っててもいいのか。しかしこれはこれで違和感あるな。
#
Prelude Data.List> transpose [[1,2,3],[4,5],[6,7,8]]
[[1,4,6],[2,5,7],[3,8]]
#
違和感の理由: transpose . transpose が恒等写像にならない
2014/03/10 01:06:49 UTCnobsun
#
まぁ。それは出所情報が消えるのでしかたないかと。ストリームの本数固定なら(1)で、zip?とか。
2014/03/10 01:08:03 UTCshiro
#
仕方ないのはわかるんだけど、transposeという名前がミスリーディングに感じるってことで。
#
zip?は最短で切りますよね。Schemeのzip(srfi-1)なら本数可変だけどやっぱり最短で切っちゃう。つまり(1)になる。
2014/03/10 01:11:05 UTCnobsun
#
>transpose そうなんですが、それをいうと転置は矩形行列を前提にしているので、長さが違えばエラーにしなければなりませんよね。それだと実用上不便かと。
2014/03/10 01:14:53 UTCshiro
#
実用上便利なように拡張するのはいいんだけどtransposeという名前が変。リストの長さが不揃いであることを事前に検出するには正格評価しないとならないからHaskellでやりたくないのはわかるけど。
2014/03/10 01:16:05 UTCnobsun
#
(3)にするなら、フィラーをTagで区別できるようにしておけばよいのでは?タグ操作のオーバーヘッドはあるけど。。。
2014/03/10 01:17:41 UTCshiro
#
caller側でタグチェックまでするとすれば、interleaveのような専用関数を用意するまでもないかなあという話になってくるので。
2014/03/10 01:20:06 UTCnobsun
#
もともと同じ長さのリストで使うことしか考えてなかったのかな。リスト型が長さ情報をたないので、2次元行列をリストのリストで表そうとしているのが敗因といえば敗因。。。
2014/03/10 01:25:10 UTCnobsun
#
最長のものに合せるためだけに使えばいいので、caller側じゃなくて、interleaveがタグチェックすればいいような。なんか勘違いしてるかな > 私
2014/03/10 01:28:27 UTCshiro
#
ああ、interleaveが認識するタグを予約しとくってことですか。
2014/03/10 01:30:57 UTCnobsun
#
予約しなくてもいいような。インターリーブがフィラーにタグを付けて、それからピックアップしたときにタグを外すだけじゃだめですか。
#
ああだめか、
#
gensymしてそいつを付けるか。
2014/03/10 01:33:59 UTCshiro
#
フィラーをどう引数で指定させるかです。seqとは別に指定させるなら、わざわざタグをつけるまでもなくinterleaveはseqを使い尽くしたことを検出できます。
2014/03/10 01:35:37 UTCnobsun
#
ああそうらそうですね。> フィラーをseqと別指定
2014/03/10 01:39:42 UTCnobsun
#
ストリームというと無限前提の感覚があるのでちょっとそっちに引き摺られたか > 和紙
2014/03/10 01:47:17 UTCnobsun
#
フィラーをcaller側で指定できるようにしたほうが汎用性はあるかなぁ。
2014/03/10 01:54:47 UTCnobsun
#
ところで、本題からはずれますが、transpose がミスリーディングな名前だとすると、かわりにどんな名前つけるのがいいと思います?
2014/03/10 01:58:08 UTCshiro
#
それが思いつけばすぐgauche.lazyにも追加したいところなんですが、思いつかないです。zip系のバリエーションってイメージですけどね。
2014/03/10 02:03:53 UTCshiro
#
ふーむ。リスト操作のzipは多分zipperから来てるんだけど、zipperはzipの本来の意味(すばやくやる、勢いよくやる、元気にやる)から来てるんで、本来の意味とは離れてるんだな。
2014/03/10 02:38:02 UTCnobsun
#
なんとなく、私の感覚ではHaskellのtranspose相当は interleave という名前に近いかなぁ。
#
(3)の仕様だとtransposeでもいいかなという感じですね。
2014/03/10 04:11:01 UTCshiro
#
糸を紡ぐイメージでどうか、と思ったけど紡ぐは英語だと単にspinなんだな。これじゃわからない。braidとかだと順番を複雑に変えてる感じがあるし。interweaveとかはどうか。なんだか似たような言葉が多くなりすぎて却って紛らわしいか。