2012-12-02 8 views
8

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することを余儀なくされていません。 (結局のところ、使用されたコンストラクタはいつもわかっています。)コンパイル後、seqIdentityconst idと同じになります。実際には、Identityのラップされた値の評価を強制するような、多形seqIdentityを作成することはできません! newtypeのWHNF aを単純に変更されていない値にすることができ、それは一貫しています。だから私は質問は、WHNFはどのように定義されていると信じてnewtype?あるいは、厳密な定義はなく、「内部のWHNFです」という振る舞いは、単に明らかなものとみなされていますか?代数データ型とは異なり

答えて

8
レポートの Datatype renamingsのセクション当たり

N⊥は⊥と同じになるように、のnewtypeコンストラクタNは、unliftedれます。ここ

Sum ⊥ = ⊥ 

のでのnewtypeの弱頭部正規形は、ラップされたタイプのWHNFであり、そして式全体が評価されるとき

Sum (lengthyComputation :: Int) `using` rseq 

は(lengthyComputationを評価し、単純バインディング

let x = Sum (lengthyComputation :: Int) `using` rseq 

はもちろんありませんが、newtypeコンストラクタなしでは同じです)。

lengthyComputation :: Intであるか否か(擬人ため申し訳ありません)を見つけるために必要とされる

seq ⊥ b = ⊥ 
seq a b = b, if a ≠ ⊥ 

ひいては

seq (Sum ⊥) b = ⊥ 

seq (lengthyComputaton :: Int) b 

seqにあるdefining equationsseqため⊥またはn ot。これを行うには、lengthyComputation :: Intと評価する必要があります。


再更新:

newtype sはunliftedあり、それは、コンストラクタは(のみ構文的に)意味論的値コンストラクタではないことを意味します。 newtypeコンストラクタのパターンマッチングは、厳密ではないdataコンストラクタのパターンマッチングとは対照的です。与えられた

newtype Foo a = Foo { unFoo :: a } -- record syntax for convenience below 

"パターンマッチ"

function :: Foo a -> Bar 
function (Foo x) = whatever x 

function y = let x = unFoo y in whatever x 

マッチが常に成功すると完全に同等であり、何を評価しません。 The constructor only coerces the typeと "パターンマッチング"は、値のタイプを非強制的にします。

seqはマジックであり、Haskellでは実装できません。 newtypeコンストラクタの "パターンマッチング"が厳密ではないため、と同じものをdataタイプ(たとえば、上記のseqMaybe、ハスケル)と同じ(多型)newtypeではなく書くことができます。ラップされた型のコンストラクタでマッチする必要がありますが、ポリモーフィックではnewtypeの場合、それらはありません。

+0

ありがとうございます。しかし、私は "newtypeはWHNFがWHNFの内部のものである"という厳密なステップが正確ではないと感じています。質問を修正し、疑問を詳細に表現しようとしました。 –

+2

「newtype」は厳密ではありません。WHNFを伝播させるためには、それが不活性です。 –

+0

拡張された回答、もっと明確にしていますか? –

関連する問題