Scala の enum についての議論

Scala の enum についての一連の議論です。  ・ enum の使いにくさについて  ・ 静的な型付けについて  ・sealed class, case class, Java の enum といった代替手段との比較など。 途中から enum とは何か、型付けとは何か、理想的な enum 云々の話に展開しています。 続きを読む
3
ruimo @ruimo

JavaのからScalaに来て困ることは、自分の場合、Enumerationがイマイチなところくらいかな... あ、あとコンパイルが遅いことw

2010-06-04 13:00:40
ruimo @ruimo

@keisuke_n そうですね。あと直列化すると、エンクロージングクラスまでいっしょに直列化されるので、バカみたいにサイズが大きくなったり。

2010-06-04 13:04:25
ruimo @ruimo

今は、Javaのソースと混ぜるのが簡単なんで、enumはJavaで用意することで妥協しちゃう。

2010-06-04 13:10:13
ruimo @ruimo

@keisuke_n たしかにScala的には、enumよりも、case classでパターンマッチの方が合いそうですね。クラス数が増えるけど。

2010-06-04 13:14:30
📙🔭✨NISHIMOTO Keisuke @keisuke_n

@ruimo ええcase classはまたニュアンスが違いますが、代用はできますね。case classでもcase objectでもたんなるobjectでも使えるので好みのものでw。Enumerationほど困ることはないですから。

2010-06-04 13:16:16
ruimo @ruimo

@keisuke_n 永遠に掘っていけるようにしてしまうか、リンクみたいにして最初に出現した場所にジャンプする感じですかね。前者は、ちょっと気持悪いかな...

2010-06-04 13:31:33
@take0123

@keisuke_n Pascalあたりだと、procedure と function に別れていますよね。

2010-06-04 13:38:45
📙🔭✨NISHIMOTO Keisuke @keisuke_n

@take0123 そうですね、そういう言語もありますね。最近の言語は分けないことが多いですけど。関数型言語に少しでも触れて理解した方はやはり返り値をつけたがります。返り値がない=副作用があるとほぼ等価だからですけど...

2010-06-04 13:42:27
kmizu @kmizu

@keisuke_n どういう場合ですか?普通はscala.Enumerationの値はmatchで使えるはずですけど。 http://gist.github.com/424971 #scala

2010-06-04 13:52:25
📙🔭✨NISHIMOTO Keisuke @keisuke_n

@kmizu 今から出かけるので手短に言うと、問題あるケースがあった(思い出せない)のと、あと型付けの問題。特定の型になってくれない問題は不自由に感じます。

2010-06-04 14:00:30
kmizu @kmizu

@keisuke_n 特定の型になってくれないということはないですよ。Enumerationを継承したクラスのValueというメンバ型でOKです。 #scala

2010-06-04 14:01:27
kmizu @kmizu

@keisuke_n たとえば、object X extends Enumeration { ... } なら、X.Valueという型でその列挙型のみを受け入れる型になります。 #scala

2010-06-04 14:02:09
📙🔭✨NISHIMOTO Keisuke @keisuke_n

@kmizu んー、それでは具合が悪いですね。

2010-06-04 14:03:29
kmizu @kmizu

@keisuke_n んー。よくわからないです。X.ValueでJavaでenum X { ... }に対してXという型を書いたのとほぼ同等になると思うのですが…。もしかして、Javaから利用するときのはなしですか?

2010-06-04 14:05:34
📙🔭✨NISHIMOTO Keisuke @keisuke_n

まぁようするにJavaのようなenumが欲しいということですね。基本的に定数なんで動的に解決して欲しくない。

2010-06-04 14:07:16
kmizu @kmizu

@yasushia 一応、object Cons { def unapply[T](list: List[T]): Option[(T, List[T])] = ... } というextractor作ればいけますけど、たぶんそういう意味ではないですよね。 #scala

2010-06-04 14:09:03
📙🔭✨NISHIMOTO Keisuke @keisuke_n

@kmizu いまそれではダメだという例が出せないのでまた後で。

2010-06-04 14:09:19
kmizu @kmizu

@keisuke_n いや、動的に解決というか、valですから静的に解決されますよ。少なくともJavaのenumと同じ程度には。 #scala

2010-06-04 14:09:56
📙🔭✨NISHIMOTO Keisuke @keisuke_n

@kmizu とにかくいまだとlazy valやvalなどの挙動の違いで使えないケースを結構経験しています。特に継承された型で発生していて、今のままでは使えないですね。

2010-06-04 14:10:22
📙🔭✨NISHIMOTO Keisuke @keisuke_n

@kmizu いやいや、静的には解決されてませんよー。

2010-06-04 14:10:50
📙🔭✨NISHIMOTO Keisuke @keisuke_n

以上の理由で私はEnumerationはまったく使わないです。

2010-06-04 14:11:52
kmizu @kmizu

@keisuke_n うーん。静的の定義が食い違ってるような。ScalaのEnumerationが動的に解決されてるというなら、同じ程度にはJavaのenumも動的ですよ。あれって、内部的にはオブジェクトアロケートしてstaticフィールドに入れてるだけですから。 #scala

2010-06-04 14:12:04
📙🔭✨NISHIMOTO Keisuke @keisuke_n

まぁわかっていってるのでしょうけど。

2010-06-04 14:12:45
📙🔭✨NISHIMOTO Keisuke @keisuke_n

とりあえず例が出てくるまでsuspend。

2010-06-04 14:13:15
1 ・・ 8 次へ