newtype
はコンパイル時に効果的に削除されるため、サンク(値のみ)はありません。では、rseq
を使用してWHNFを要求するとどうなりますか?例えばnewtypeのWHNFとは何ですか?rseqはnewtypeでどのように動作しますか?
Sum (lengthyComputation :: Int) `using` rseq
に
Sum
が
newtype Sum a = Sum { getSum :: a }
として定義されて
はlengthyComputation
評価されたりしませ得るのだろうか?それは私がそれに数えることができるように指定/文書化されていますか?
更新:私は、より詳細に私の疑問を説明しましょう。直感的に言えば、「newtype
は厳密にWHNFがWHNFの内側に包まれたものです。しかし、私はこれが非常に不正確なショートカットであり、推論はあまり明確ではないと感じています。
標準のdata
タイプでは、WHNFは値を構成するためにどのコンストラクタが使用されたかを知る形式として定義できます。例えば、我々はseq
を持っていなかった、場合、私たちはそのコンストラクタの1にパターンマッチングにより、任意のdata
タイプの私たち自身の
seqMaybe :: Maybe a -> b -> b
seqMaybe Nothing = id
seqMaybe _ = id
と同様に作成することができます。
今度は
newtype Identity a = Identity { runIdentity :: a }
を取ると同様のseqIdentity
関数を作成してみましょう:
seqIdentity :: Identity a -> b -> b
seqIdentity (Identity _) = id
、何もここでWHNFすることを余儀なくされていません。 (結局のところ、使用されたコンストラクタはいつもわかっています。)コンパイル後、seqIdentity
はconst id
と同じになります。実際には、Identity
のラップされた値の評価を強制するような、多形seqIdentity
を作成することはできません! newtype
のWHNF aを単純に変更されていない値にすることができ、それは一貫しています。だから私は質問は、WHNFはどのように定義されていると信じてnewtype
?あるいは、厳密な定義はなく、「内部のWHNFです」という振る舞いは、単に明らかなものとみなされていますか?代数データ型とは異なり
ありがとうございます。しかし、私は "newtypeはWHNFがWHNFの内部のものである"という厳密なステップが正確ではないと感じています。質問を修正し、疑問を詳細に表現しようとしました。 –
「newtype」は厳密ではありません。WHNFを伝播させるためには、それが不活性です。 –
拡張された回答、もっと明確にしていますか? –