【お知らせ】プログラミング記事の投稿はQiitaに移行しました。id:n7shi:20101226)。この方法だととりあえずF#で何か作れるようにはなりますが、F#特有の概念の理解にはあまり役に立ちません。くるさんが判別共用体について議論されているのを見て、判別共用体を使ったことがないのに気付きました。判別共用体のケース識別子は直接公開せず、インターフェイスをアクティブパターンで提供するのがスマートっぽいよ判別共用体の存在は知っていましたが、どういう時に使えば良いのかピンと来ていませんでした。そこで今度は逆にF#からC#に変換しながら考えてみました。F#ではC#で感じていた手間が軽減されていることに気付き、自分の中で判別共用体の位置付けが少し固まった気がします。結論から言うと判別共用体は「継承による多態を簡潔に記述」できる構文です。くるさんの例を改変して引用します。くるさんの本来の議論からは外れますが、アクティブパターンやパイプライン演算子のことまで考えると混乱するので、判別共用体に焦点を絞っています。hoge)これをC#に変換してみます。}}F#とC#を比較すると、C#では継承とvirtualで表現しているため、評価関数の実装が分散して冗長になっています。評価関数をまとめてみます。}}記述はF#に近くなりました。評価関数でのキャストが目に付きますが、これはどうしようもありません。コンストラクタを削減するともう少し短くなります。}}かなり頑張りましたが、利用側での記述があまりに冗長です。くるさんのマルチパラダイムの例のように、インスタンス生成関数を提供するべきでしょう。C#では継承とvirtualで書くことが多く、別の箇所でまとめることは少ないように思います。まとめて書くと、アスペクト指向的に実装を横断しているという印象を受けます。いずれにしてもF#の書き方は簡潔です。F#を単にC#からの直訳で使っていても、構文が簡潔だということに多大なメリットを感じていましたが、このように特化した構文ではそれが顕著です。AST今回の例ではASTを組み立てて値を評価しています。いえばコンパイラを作ったとき(id:n7shi:20110111)、コンパイル時に値を評価するため似たようなことを書いたのを思い出しました。これはF#がハマるパターンなので、C#の例はわざと直訳で複雑になっているような印象を与えるかもしれません。実際に私がC#でコンパイラを作ったとき、何の疑問もなくそういう複雑な書き方をしていました。https://github.com/7shi/LLPML/blob/1.7-20100723/LLPML/Operators/Operators.2.csコンパイラを作るとき「まずは動かす」ことだけを考えていたので、複雑なことをすっきり書ける言語仕様にまで頭が回りませんでした。何が目的で何が手段なのかよくわからない状態ですが、あまり深く考えていないので悪しからず。(1)はてなブログをはじめよう!n7shiさんは、はてなブログを使っています。ブログを報告するスターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。