ハスケルのような遅延プログラミング言語の正確な型が何であるか知りたい。遅延評価におけるプリミティブ関数のタイプ
ここで、サンクは弱い頭の通常の形のオブジェクトに評価されています。次に、Cのような厳密な言語でのプリミティブ関数の型はどうでしょうか?
私の推測は、次のとおりです。
primitive1 : (thunk, thunk, ...) -> thunk
primitive2 : (thunk, thunk, ...) -> object
私は、彼らがそれらのいくつかを必要としないかもしれないので、プリミティブ関数は、引数としてサンクを渡すべきだと思います。しかし、私は彼らがサンクや評価されたオブジェクトを返す必要があるかどうかはわかりませんが、遅いものは以下のようないくつかの関数でラップして怠け者にする必要があります。 GHC、Haskellの原始関数(時々PrimOpと呼ばれる)(「ヒープ・オブジェクト」)はポインタの混合物と呼ば であり、(Cスタイルのint値を含む、ダブルス、など)非ボックス化 タイプで
lazy : ((thunk, thunk, ...) -> object) -> ((thunk, thunk, ...) -> thunk)
実装に依存するので、この質問に対する一意の答えはありません。 ghcでは、プリミティブ演算はプリミティブ型を持ちます。C言語と同じ型です。プリミティブ型をサンクでラップアンドアンラッピングするための別の操作があります。 – augustss
@augustss ifとcase式はどうですか?彼らのプリミティブはサンクスに直接渡されなければなりません。または、彼らはカレーですか? – raviqqe
if式がcase式に変換されます。また、プリミティブがない場合は、型に依存する(抽象的な)マシンコードに変換されます。簡略化された最初のscrutineeはWHNFに評価され、次にコンストラクタ番号を抽出してジャンプテーブルのオフセットとして使用します。ジャンプするコードは、コンストラクタのフィールドを展開し、評価を続行します。 – augustss