空文字列をsplitしたらどうなる?

8
いわた @wonderful_panda

"" をカンマでsplitすると長さ0の配列が返るべきか長さ1の配列が返るべきかみたいなのも意外に意見が分かれるらしい

2021-06-21 14:43:27
いわた @wonderful_panda

投票とってみるか。 「与えられた文字列をカンマでsplitした結果を配列で返す」というメソッドがあるとして、空文字列を指定した結果は

2021-06-21 14:46:03
いわた @wonderful_panda

前は長さ1一択だろと思ってたんだけど、逆の処理であるjoinを考えると [].join(",") も[""].join(",") も空文字列になるんだから長さ0もアリなのか?って思うようになった でもやっぱり長さ1が自然な気はする twitter.com/wonderful_pand…

2021-06-21 15:29:43
ツルゲーネフ @e9g

",a,,b,"みたいな文字列を["a", "b"]にするような関数だったら長さ0だし["", "a", "", "b", ""]にするような関数だったら長さ1だけど一般的に後者がsplitと呼ばれるということか splitは多くの場合上記2関数の結果が同じになるような入力に使いがちなので混乱するのはしょうがなさそう twitter.com/wonderful_pand…

2021-06-21 20:09:24
常藍守 奏 🍜💜💌🍐🍣🐱🐟🌱☔🐉 @cppig1995

個人的に split(u, v) には (1) join(split(u, v), v) = u である (2) u に v は (length(split(u, v)) - 1) 回含まれている を満たしてほしい。しかし、split(ε, v) = [] にした場合、(1) は join([], v) = ε とすればいいものの、(2) はどうしても満たせない。故に split(ε, v) = [ε] にするべき。 twitter.com/wonderful_pand…

2021-06-21 20:09:25
すぴスラ _(:3」∠)_ @dev_supisula

「行末が改行のときは長さ1、行末がEOFのときは長さ0」にしたくなった(した)ことがある twitter.com/wonderful_pand…

2021-06-21 20:09:40
いわた @wonderful_panda

joinをsplitの逆関数だと考えると [].join(",") も [""].join(",") も"" になるのでどちらもそれなりに妥当性があるのかなという twitter.com/uhyo_/status/1…

2021-06-21 20:18:38
🈚️うひょ🤪✒📘 TypeScript本発売🫐 @uhyo_

長さ1が自然だと思うんだが、長さ0派もそれなりの主張を持っている件だ。joinとsplitの公理をいい感じに定めたらどちらかの長さが導かれないかな(?)

2021-06-21 19:59:05
いわた @wonderful_panda

csv文字列a, bの結合を a + b == a + "," + b と定義するなら"" は1項目としてカウントしないとおかしくなる

2021-06-21 20:21:19
なんとかなんとかさん @selvaggio

a = join(split(a))となるのが良い、と思ったけど、[].join(",")と[""].join(",")とどっちも特異点な気がしてしまった。割り算と同型…同型? twitter.com/wonderful_pand…

2021-06-21 20:51:12
いわた @wonderful_panda

投票では長さ0派がわずかに優勢だけど引用RTでは長さ1派が圧倒的に優勢なんだよな。 まあ投票結果で負けてる方が一言言いたくなる率が高いというだけの話かもだけど。 twitter.com/wonderful_pand…

2021-06-21 20:54:37
岡竜之介 @agajo

JSやPHPみたいな「エラーが起きにくい」言語が好きか、RustやHaskellみたいな「認識違いを検出しやすい」言語が好きかで割れてそう? 僕は後者で、join([]) は例外投げるべきという過激派です。でないと整合してなくない?joinに[]が渡る可能性がある時点で認識違いが起きてそうなので、検出して欲しい twitter.com/wonderful_pand…

2021-06-21 21:12:03
Shiro Kawai @anohana

これはこの条件だけでは仕様が曖昧なので、Schemeでは引数でいくつかの解釈を指定できるようにしてますね srfi.schemers.org/srfi-152/srfi-… twitter.com/wonderful_pand…

2021-06-21 21:16:55
Dan Kogai (小飼 弾) @dankogai

ワシはこの場合['']を返すべきと考える派。str. split(delim). length は常に number of delims + 1 になるべき。JSはそうなってる( ''.split(',') で [''], ','.split(',') で ['',''])。が、PerlとRubyはどちらも空配列を返す twitter.com/wonderful_pand…

2021-06-21 21:49:43
mattn @mattn_jp

split("aa", ",") == ["aa"] split("a", ",") == ["a"] split("", ",") == [""] 長さ1の配列が返るのが自然だと思います。 twitter.com/wonderful_pand…

2021-06-21 22:05:25
KOIZUKA Akihiko @koizuka

split(':', ':') で ['', ''] が返るのであれば、要素としての空文字列は有効な値であり、そうなると入力が空文字列なら空文字列1要素がそのまま返るのが一貫性を感じるな。 空文字列のときは値なしにしたいケースもあるというのはあるんだけど。 twitter.com/wonderful_pand…

2021-06-21 22:12:14
モーくん @calfscalf

CSVファイルへの応用まで考えると前者が便利な場面もありそうだけど、splitのようなプリミティブな処理の時点では一貫性を重視して後者であって欲しい。(前者が便利な局面なら、splitの呼び出し元で空文字列を特別扱いすれば良い) twitter.com/wonderful_pand…

2021-06-21 22:16:18
Haruhiko Okumura @h_okumura

Python も ''.split(',') は [''] を,','.split(',') は ['', ''] を返す twitter.com/dankogai/statu…

2021-06-21 22:27:46
Akinori Ito @akinori_ito

split問題,根深いんだな 空文字列をsplitした結果→ 空リスト派: Perl, Ruby, R, D, Go, Tcl 空文字列のリスト派: JavaScript, Python, Java, Kotlin

2021-06-21 22:55:56
リーサ・リサージュ・ヤスミン @LisaDQX

,以降の文字列を除いた文字列を取得するときに便利なので1が良いかと。例えば#がコメントのファイルにて#以降を除去したいケース。 twitter.com/wonderful_pand…

2021-06-21 23:15:16
Dan Kogai (小飼 弾) @dankogai

Swift が興味深い。omittingEmptySubsequences: という引数があってこれのデフォルトが true。デフォルトはfalseであるべきだと思うけど 1> print("".split(separator:",")) [] 2> print("".split(separator:",", omittingEmptySubsequences:false)) [""]

2021-06-21 23:23:03
Seiya Yazaki @saiya_moebius

植木算の法則や「任意文字列に "," を足したものを split した結果の要素数は元の文字列に対して +1」「任意文字列に "" を足したものを split しても結果の要素数は変わらない」等の法則は「"" を split した結果の要素数が 1」でないと一貫しない。空を返したい気持ちは分かるが仕様としては汚い。 twitter.com/wonderful_pand…

2021-06-21 23:28:17
ちょくや @Nao_Mk2

2,000票以上あって半々なのかー、面白い! 自分は1派で0だと空文字はどこ行っちゃったの?って思うんだけど、そうなる言語をずっと触ってたら違う感想になるかもなぁ twitter.com/wonderful_pand…

2021-06-21 23:34:23
Mr.bug(コーダー) @tako_and_kitune

投票したあとに、引用を見る前に、 『分割する関数に、デリミタなしで入れたんだから入れたものが帰るべきでしょう。だから""が帰るべきで長さ0かな🤔』という思いっきりの矛盾で投票してしまった。 twitter.com/wonderful_pand…

2021-06-21 23:35:30
松田明 @matsuda_akira

"a¥n¥nb¥n" というCSVは、1項目がそれぞれ"a"、""、"b"である3行だと解釈したいので、3行とも長さ1の配列が望ましいです。2行目だけ特別な処理が必要だとめんどくさいです。 twitter.com/wonderful_pand…

2021-06-21 23:37:14
Yuta SAWA @sawawww

これ、ぶっちゃけどっちでもいい派。 カンマでjoinして元に戻ることが重要なので、長さ0でも1でもどっちでもいい。 テストケースで漏れそうだから1の方が助かる気持ちもわかる。 でも私はPerlを親だと思っているので0にしました。 twitter.com/wonderful_pand…

2021-06-21 23:40:12