なぜこれらは同等ではないのですか?
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 types
Haskell にはないことを理解していますが、なぜそうなのか、そしてそれを実現するための言語の設計を妨げている理由を知りたいのです。
x :: Int | Bool
コンパイルする必要がある場合、型消去ベースのRTSで、show x
を呼び出すために使用する関数へのポインターを簡単に知る方法はありませんshow
。実行時にいくつかのタイプレベルの情報を保持する必要があるでしょう。
(String, Int)
匿名ではありません。それはおかしな構文を持つ通常の製品タイプにすぎません。(String | Int)
まったく違うでしょう。(Int|Int)
と同一であるかどうかInt
とその理由を自問することから始めます。
if ... then ... else ...
、内の同じタイプの持っている必要がありますthen
し、else
一部を。一部のプログラミング言語では、これを三項演算子として見ることができます。