2015-09-25 13 views
16

returnpureの違いはControl.Applicativeですか? doブロックの最後でもpureを使用できるようですか?'返品'と '純粋'の差

他の人よりも優先する必要がある状況はありますか(誰もがブロックの末尾にreturnが必要です)。

+6

違いはありませんが、どちらも歴史的な理由から存在します(「Monad」は常に「Applicative」のスーパークラスではありませんでした)。 '純粋な'に 'return 'をエイリアスする提案があります。 – Lee

+3

明確にするために、あなたが 'Monad'を扱っていることを知っていれば、それらは同じです。 'pure'は' Applicative'を返す 'return'よりも一般的です。あなたは' return'のすべてのインスタンスを 'pure'で置き換えることはできませんが、' pure'を 'return'で置き換えることができます。 – Lee

+8

@Lee、私はそれがあなたの2番目の文の周りの別の方法だと思います。 –

答えて

26

GHC 7.8以前では、ApplicativeMonadのスーパークラスではありませんでした。 MonadインスタンスにApplicativeインスタンスを持たないことも可能でした。しかし、purereturnは、両方のインスタンスである型に対して同じ動作をする必要があります。 Functor-Applicative-Monad ProposalにGHC 7.10で

Applicativeは現在Monadclass Applicative m => Monad m)のスーパークラスであり、それは今purereturnすべてMonadインスタンスで同じでなければならないルールです。実際、returnの既定の実装は、the source on hackageに示すように、pureになりました。

pureは、という制約がありません。Applicativeという制約があり、関数がより一般的になるため、returnよりも優先される可能性があります。 returnは、歴史的な前例のために表記でpureよりも好ましい場合がありますが、pureを使用してもまったく同じ効果が得られます。

12

Monadの後に適用型のクラスが追加されており、歴史的にはMonadクラスはApplicativeのサブクラスではありません。これは、Applicative-Monad-Proposalでかなり最近変更されました。つまり、return aは、Monadインスタンスごとにpure aに相当するはずです。

pureの別名にMonadクラスのうちreturnを移動させるためのproposalがあります。

したがって、Monadを扱う場合は、returnの代わりにpureを常に使用することができます。ただし、は、Applicativeを返すだけなので、returnより一般的な型を持っているため、別の方法は使用できません。たとえば、次の

wontCheck :: Applicative f => f Int 
wontCheck = return 4 

returnMonadするfを必要とするので、型チェックはありません。

+0

他の回答は受け入れられていましたが、以前は本当に好きでした –

関連する問題