4 に答える
参照透過性は、等価ステートメントと変数参照に関するものです。x = yと言い、言語が参照透過的である場合、 xのすべての出現をy (モジュロ スコープ)に置き換えることができます。
を指定していない場合、あなたの場合のように安全にx = ()
置き換えることはできません。これは の住人についてあなたが間違っているからです。Haskell には 2 つあるからです。もう 1 つは、計算されない値です。これをbottomまたはundefinedと呼ぶことができます:x
()
()
()
()
x :: ()
x = x
x
ここでのbyの出現を置き換えることはできません()
。言語セマンティクスにおける下の存在により、いくつかのぎこちないエッジ ケースが可能になります。特にseq
コンビネータがある場合は、すべてのモナドが間違っていることを証明することさえできます。そのため、多くの正式な議論で、底の存在を無視しています。
ただし、参照透過性はその影響を受けません。Haskell は依然として参照透過性があり、純粋に関数型の言語です。
参照透過性の定義が正しくありません。x :: ()
参照透過性は、置き換え可能で() :: ()
あり、すべてが同じままであることを意味するものではありません。つまり、変数のすべての出現をその定義に置き換えることができ、すべてが同じままです。この定義を使用する場合、参照透過性と競合しませんseq
。rseq
seq
ここでは赤いニシンです。
unitseq :: () -> a -> a
unitseq x y = case x of () -> y
これは on unit と同じセマンティクスを持ち、seq
魔法は必要ありません。実際には、seq
パターン マッチできないもの、つまり関数に取り組んでいるときにのみ、何か「魔法」があります。
で置き換えるundefined :: ()
と、より魔法の と()
同じ悪影響があります。unitseq
seq
一般に、私たちは価値を「何であるか」だけでなく、どのように定義されているかについて考えます。この観点から、定義性を変更する変換を意のままに実装できない理由は明らかです。