Haskellには参照がありません(参照は変更可能なオブジェクトであり、Haskellには(直接アクセス可能な)変更可能なオブジェクトがありません)。したがって、関数呼び出しは、デフォルトのような値のセマンティクスを使用します。これは実際、純粋な関数型言語の重要な特性です。関数は引数を変更できません。
値のセマンティクスは、コピーが内部で行われることを意味しません。関数が変更する値の一部のみをコピーする必要があります。つまり、純粋な言語では、何もコピーする必要はありません。
ただし、これだけではありません。ある意味で、Haskellには参照セマンティクスがあります。
関数が引数を変更するかどうかをテストすることは意味がありません(変更しないかどうか)が、関数がその引数(の一部)を使用するかどうかをテストできます。終了しない引数を指定してください。関数呼び出しが終了すると、関数が引数を使用しなかったことがわかります。
let bottom = bottom
let ignore x = 1
ignore bottom
あなたが評価した場合bottom
、それは終了しません:bottom
それ自体に展開し、悪心。用語にbottom
値を含めることはできません。しかし、あなたが評価ignore bottom
した場合、その値は1
です。これは、関数を呼び出すときにignore
引数の値を計算する必要がないことを示しています。この意味で、Haskellには参照セマンティクスがあります。関数が受け取るのは値ではなく、この値を見つけることができるものです。技術用語は、名前による呼び出しです(値による呼び出しではありません)。
(より正確には、Haskell実装はcall by needを使用します。callby valueでは、関数の引数は関数を呼び出す直前に1回だけ評価されます。callby nameでは、引数は使用されるたびに評価されます。関数の必要な回数だけ実行されます。必要に応じた呼び出しでは、引数は最大で1回評価されます。最初に使用されたときに評価されます。使用されていない場合は評価されません。)
a
「の値をチェックする」という意味ですか?