なぜこれらは同等ではないのですか?
show $ if someCondition then someInt else some double
そして
if someCondition then show someInt else show someDouble
if ... else最初の例の部分を単独で式に分離した場合Int | Double、TypeScriptで簡単に実行できるようなTypeのような匿名合計型でその型を表すことができないことを理解しています(TypeScriptについて言及しているため、 langaugeは頻繁に使用し、Sum型をサポートしているため、Eitherデータを使用する必要があるため、それに基づいてを呼び出しますshow。
ここで示した例はささいなことですが、私にとっては、someCondition「何かを表示し、何かが依存する」と考える方が理にかなっています。コードの重複が少ない場合(ここでは、ショーが2回繰り返されますが、長い関数のアプリケーションでif ... elseある可能性があり、2つ以上の分岐を検討する必要がある場合もあります)
私の考えでは、合計型(ここではInt | Double)を構成する各型がshow関数のパラメーターとして使用できるかどうかをコンパイラーがチェックし、型が正しいかどうかを判断するのは簡単です。さらに良いのは、show関数がstringパラメーターのタイプに関係なく常に返されるため、コンパイラーがすべての可能な「ブランチ」(したがってすべての可能なタイプ)を運ぶ必要がないことです。
そのような機能が存在しないのは選択によるものですか?それとも、実装するのは難しいと思いますか?
making all conversions explicitます。私の質問では、HaskellをにキャストIntしDoubleたり、その逆をしたりしたくありません。例として、この2つのタイプを使用しました。あなたはすべてを置き換えることができIntてaとDoubleしてb、両方のタイプが派生私の質問にShow。anonymous sum typesHaskell にはないことを理解していますが、なぜそうなのか、そしてそれを実現するための言語の設計を妨げている理由を知りたいのです。
x :: Int | Boolコンパイルする必要がある場合、型消去ベースのRTSで、show xを呼び出すために使用する関数へのポインターを簡単に知る方法はありませんshow。実行時にいくつかのタイプレベルの情報を保持する必要があるでしょう。
(String, Int)匿名ではありません。それはおかしな構文を持つ通常の製品タイプにすぎません。(String | Int)まったく違うでしょう。(Int|Int)と同一であるかどうかIntとその理由を自問することから始めます。
if ... then ... else ...、内の同じタイプの持っている必要がありますthenし、else一部を。一部のプログラミング言語では、これを三項演算子として見ることができます。