C#使いをScalaに引き込む必要ないのにちょっと比べてみる

なんかJava使いをScalaに引き込むサンプル集っていうのが話題になってたから書いてみた。反省はしていない( `ー´)
べつに喧嘩したいわけじゃないっていうか、そもそもC#使いをScalaに引き込む必要ないし、誰得?ってことになるわけなのですが。

ただ、自分自身の話すると、まだ社会人2年目ですが、C#scalaも仕事でそれなりに数ヶ月は経験してます。
scala知ってる人に、"C#できますか?"って聞いても、できる人がほとんどいなく、悲しい思いをすることが多いです。個人的には、scalaちゃんもC#たんもかわいい

@GrierVelsXX @xuwei_k フォローと応援、是非宜しくお願いいたしますless than a minute ago via Tween

↑なぜか話しかけられたw

とかではなく、まぁまぁC#も言語として好きなので、まぁちょっと自分なりに整理してみただけです

そもそも
scalaのほうが後発なので、言語仕様が整理されててまとまってるのは当たり前
です。その点理解した上でみんな議論しましょう。

あと自分なりにまとめただけなので、間違ってるとこあるかもしれませんので、何かあればどんどん突っ込んでください。

あと、全然完璧ではないので、あとからちょこちょこ追記するかもしれません。

そして、個人的にscalaのほうが詳しいので、C#の記述がかなり中途半端になってる可能性が大ですが、これに刺激されて、だれかC#の良さについてscalaと比べて熱く語ってください。



scalaの方が有利(もしくは機能が豊富)だと思う点



Actor

標準じゃないやつならあるらしい(?)が、scalaは標準ライブラリにくっついてるってのがポイント高い。で、scalaのいろいろな文法のおかげで書きやすいし


パターンマッチ

これは無いと生きていけない*1
気が向いたらあとでちゃんと書く


ラムダ短く書ける

そのパラメータが1度しか使わない場合には、_ を使って、変数に名前つける必要ないってやつ


Tuple

C#4.0からあるけどパターンマッチがぁぁぁ。そして、Tuple.createとか作るのも、記述量がかなり多くてめんどい


コレクションクラスの高階関数

これは、C#以外の言語と比べてもscala独自の特徴だと思われるんだが、他の言語そこまで詳しく知らないので・・・

MapをmapすればMapが返って来る
ListをmapすればListが返ってくる
ってやつ

C#だとDictionaryをSelectするとDictionaryが返るのか?ってことになるのかな
ただ、C#の場合、LINQとかうまく使えば大して困らない気がするが、知識不足のためよくわかりません、すいません


もうみずしまさんのこれ、
JavaとScalaとC#のジェネリクス機能比較表
見れば型まわりの、たいがいの事は書いてあるので・・・
結論を言えば、

  • Scalaで出来て、C#でできないこと
  • C#で出来て、Scalaでできないこと

の両方があります。
これの最後の方にでてくる
ジェネリックな型エイリアス
っていうのは、ゆろよろさんのもりそばを読みましょう。これはC#にはない、明らかにscalaが有利な点・・・だと思う


型推論がちょっとだけ高機能

C#の場合ローカル変数だけだけど、scalaはフィールドとかメソッドの戻り値も型省略可能・・・ってだけ。
まぁその辺は、scalaよりその他の関数型言語のほうが高機能ですが・・・



import文
  • packageもimportできる
  • 相対import
  • ファイルの先頭以外でもどこでもimport文書ける

など、だいぶ高機能です



structural subtyping

まぁべつにたいしていらない気もするけど・・・


REPL

便利ですよ。標準で付いてるし、補完きくし。
しかしC#には強力なIDEあるし、なくても困らないか・・・


STM

なんか.NET用のSTM.NETっていうのが昔あったらしいけど、頓挫した(?)ってまえtwitter上で聞いた。
scalaも出来たばかりだし、まだ発展途上でどうなるかは、わからないが、2.9またはそれ以降に標準ライブラリとして入るって話


immutableにしやすい
  • メソッドの引数がデフォルトでimmutable
  • ローカル変数でのvalに相当するものがC#にない*2

しかし、
C#で数十行まるまるLINQでかいて、そのなかでlet使えばローカル変数もimmutableじゃん的な、すごいコードを見た覚えがあるんだが*3、どこだったか忘れた・・・


コンストラクタの構文

これは絶対便利。コンストラクタの引数と、フィールド同時に定義できるっていうもの。
(なれないと見た目キモイけど)C#より確実に記述量減る


match式

これもかなり便利ですねぇ
C#のswitch文と比べて

  • パターンマッチできる
  • match式自体が値を返す
  • どんな型でも対象にできる

っていう点が


if式

if文自体が値を返す

まぁ機能としては、3項演算子っていえばそれまでなんですが、3項演算子だと、

  • ? と : って1文字で読みにくい
  • elseが2、3回続いた場合にif式のほうがわかりやすい

と個人的には思う


try catchも値返す

便利ですよ


implicit parameter

すごく使いこなせば、ものすごく高度な型の操作ができる。他人の記事の紹介で申し訳ないが、これとか*4

自分も理解できてないけど、
@okomokさんの このライブラリ とか
これとか


implicit conversion

拡張メソッドとか、できることは似てるけど違うよな・・・
これは、うまく比べて書くの難しい・・・


trait

これはC#にはないですね。個人的にはそこまで使わないけど。


case class

全く同じような機能はないよな・・・?
とりあえず自分でcase classについてまとめたやつ


メソッド名に記号つかえる

これは、
オブジェクトとメソッドの間のカンマ省略できる
というのと合わせて、演算子オーバーロードと同等以上の機能を果たしますね。まぁやりすぎると読みにくいけど。


returnとかセミコロンとか余計なカッコ省略

まぁ慣れの問題っていえばそうですが。
個人的には、returnとかセミコロンとか省略できるのは地味に便利、というか好きです


シングルトン

C#にもstatic classってものがあって、同じモノかと思いきや
継承ができないので全然違います。あれはただのstaticなメソッドや変数の置き場所です。scalaのほうが使いやすい!

*5


最初から、関数型を考慮して設計されているので便利

例えばC#で、ActionとFuncを区別しないといけないとかめんどくさい
その他いろいろ細かいところある気がする。


コンパイラプラグインによる限定継続

気が向いたらあとで書く


コンパイラプラグインという仕組み

気が向いたらあとで書く




C#のほうが有利だと思う点


並列まわりの一部

一概には言えないが、C#のほうが進んでる部分もある
Parallel Forなんてものがあったりとか


unsignedとか、プリミティブ型が多い

decimalとかもあるし


拡張メソッド

implicitと似てなくもないが、なんか逆にわかりやすい拡張メソッドが個人的に割と好きだったりする。


IDE

いやすごいっす。まじで。


オーバーフローのチェック

checkedってキーワードある
これは、JVMの問題か?


LINQ

あまり詳しくないけどとにかくすごいよ。


構造体

一言でいうと、ヒープではなくスタックつかわれるっていう話。
構造体ってどのくらい使われてるの?
これが、JavaScalaにないのはJVMの問題なのか?それとも単に、大して必要ないという判断か?


unsafe文

JavaとかscalaだとJNI書かなちゃいけないところを、C#だと書きやすいって認識でいいの?これどのくらい使われてるの?


internal

アセンブリ内でprivate


参照渡し(ref とか out)

おそらく、CやC++からのポインタや参照渡しの概念を受け継いだためにあると思うんだが・・・・
これって今になってみるとどうなの?どのくらい使われてるの?ただの過去の遺産?関数型と相性悪いよね?いやでも便利なときもありそうだけど自分は適切な使い方あまりわかってない


event

eventの機能自体あまりわかってないけど・・・とりあえずscalaに直接対応するものはないはず(?)
scalaで対応するものをやるとしたらどうなるんだろう・・・



その他どっちが有利なのかよくわからんもの




xmlリテラル

まぁ・・・作者も今となってはこの機能微妙だったっていってるくらいですから・・・たまーに便利だけど

*1:それは大げさだがそのくらい便利

*2:たしかconstはプリミティブ型だけだっけ?

*3:はてなダイアリーだった気がする

*4:むしろこれは型の操作としては初級〜中級なくらいで、もっと変態的な操作もできるらしいが、自分には身についてない・・・orz

*5:こんなに自信持って言い切って、間違ってたらどうしようかと、内心結構 (;゚Д゚)ガクブル なんですが、間違ってたらだれか突っ込んでください