scalaのmatch-caseは型安全?非型安全?

3
西田和史(k.bigwheel) 開発基盤EM @k_bigwheel

scala - Tuple Unpacking in Map Operations - Stack Overflow bit.ly/1qzg4Wv これ、一番正しいのはbest answerじゃなくてその下のtupledを使うことじゃないかな?

2014-09-04 12:12:25
西田和史(k.bigwheel) 開発基盤EM @k_bigwheel

以前からscalaのmapでtupleを各変数へ展開するときにcaseを使うことは間違ってる気がしてたんだけど、やっぱこれ型安全じゃないよね?Function.tupledは初めて知ったけどこれは型安全な気がするしこれを使うのが正解だと思う

2014-09-04 12:13:30
西田和史(k.bigwheel) 開発基盤EM @k_bigwheel

match-caseが型安全じゃないことに多くの人が結構なケースで鈍感な気がする。これ記述が間違ってても実行時にしかわからないんだから静的型付けの利点を全く行かせてない

2014-09-04 12:17:28
がくぞ @gakuzzzz

@k_bigwheel 型安全という面では、case使う場合でもタプルの型に合わないパターンを指定するとコンパイルエラーになるので安全性は担保されてますね。ただ、もちろんマッチエラーになるパターンも書けてしまうので、そういう意味ではtupledの方が安全というのは正しいと思います

2014-09-04 12:26:15
kmizu @kmizu

@k_bigwheel @gakuzzzz それ、型安全の定義によりませんか?match-caseが(caseの中身によっては)型安全じゃないのは事実ですが。

2014-09-04 12:29:20
kmizu @kmizu

@k_bigwheel @gakuzzzz たとえば、sealed trait + case classedだと記述が網羅的じゃなければ警告出してくれるわけですし。

2014-09-04 12:29:59
がくぞ @gakuzzzz

@kmizu @k_bigwheel マッチエラーに配慮してないパターンマッチが安全じゃないのは確かですねー。で、その安全性を「型安全」という言葉に含めるか含めないかは言葉の定義の問題で、TaPLの「型安全」の定義だと含まれないという感じですかね

2014-09-04 12:32:10
西田和史(k.bigwheel) 開発基盤EM @k_bigwheel

@kmizu @gakuzzzz そうか、なるほど。型安全という言葉を適当に使ってました。

2014-09-04 12:59:11
Kenji Yoshida @xuwei_k

Scalaのパターンマッチで、Any型をIntやStringかどうか検査するような邪悪というか本来必要ないことまでできてしまうの大体subtypingが悪かったりする(?)のでHaskell使いましょう、となるか、そういうのを禁止するコンパイルオプションが求められる

2014-09-04 13:01:30
Kenji Yoshida @xuwei_k

withFilterがあると、そういう邪悪なパターンマッチまで警告なしでできてしまうのでwithFilter入れるのやめましょう、という結論になった議論がこちらにあります github.com/scalaz/scalaz/…

2014-09-04 13:06:27
西田和史(k.bigwheel) 開発基盤EM @k_bigwheel

match-caseが型安全じゃないことに多くの人が~~ bit.ly/1lB0OJG これkmizuさんとgakuzzzzさんが突っ込んでくれたんですが間違ってます。正しくはmatch-caseは型安全じゃない使い方もできる(できてしまう)が正しいです

2014-09-04 13:07:30
Takashi Miyamoto @tmiya_

@xuwei_k OOというか継承無しのscala欲しいですねー。っていうかJVM用のOCamlで良い、というのは判ってるんだけど仕事では使えない。

2014-09-04 13:13:10
zakki @k_matsuzaki

OCaml…OOも継承もあるのに…

2014-09-04 13:16:03
zakki @k_matsuzaki

パターンマッチに影響及ぼさない機能ってことか

2014-09-04 13:18:26
櫻井洋志 @h_sakurai

Scalaは色々出来すぎるあたりで、C++とかPerlみたいだと思う。Anyは動的言語みたいに使えて、便利だから、動的言語にはこういう機能があると嬉しいんじゃないかなぁ。 邪悪とか、本来必要ないというのは、Haskellの型システムに近づけようっていう考えから来てるのだろうけど

2014-09-04 13:18:52
櫻井洋志 @h_sakurai

機能として出来る事が多いのはすばらしいし、短くかけるメリットもあるし、それを実装するのは大変なわけだし。悪者にされると腹立つなぁ。無くすなら無くすで良いとも思うし、コーディング規約で縛れば良い話で。

2014-09-04 13:22:04
櫻井洋志 @h_sakurai

そういう反発がHaskell原理主義は出て行けっていう考えに繋がっていって、別の言語にForkするみたいになってるんじゃないのかな? Scala自体は好きだけど、Scalaz信者は嫌いだ。みたいになってしまうよ。 HaskellもScalazも悪くないと思うけど。

2014-09-04 13:27:28
Kenji Yoshida @xuwei_k

@h_sakurai 規約でしばれるならいいけど、コンパイラ側に警告だすなどのそういうオプションが全然ないので、規約でやろうとしても現実的にほぼ不可能なのが問題ですね、Anyからのパターンマッチが許されてしまってる件は・・・

2014-09-04 13:30:57
Kenji Yoshida @xuwei_k

.@h_sakurai 邪悪、という言い方が悪かったのかもしれませんが、たしかに仕方ないというか便利に短く使えるときもあるので「今すぐ禁止しろ」とまでは思わないですけど、同じパターンマッチでも強力さや安全性が異なるので、それを意識して使い分けれるようなオプションが欲しいというか

2014-09-04 13:35:19
Kenji Yoshida @xuwei_k

@k_matsuzaki OCamlだと、ここ twitter.com/xuwei_k/status… でいったScalaでの危険なパターンマッチ?のようなことって、ちゃんとできないようになってるんでしたっけ?

2014-09-04 14:58:39
zakki @k_matsuzaki

@xuwei_k Any型が存在しませんし、オブジェクトを一回アップキャストしてしまうともうダウンキャストできないような。(Objとかで無茶しない限り)

2014-09-04 15:08:01