return
とpure
の違いはControl.Applicative
ですか? do
ブロックの最後でもpure
を使用できるようですか?'返品'と '純粋'の差
他の人よりも優先する必要がある状況はありますか(誰もがブロックの末尾にreturn
が必要です)。
return
とpure
の違いはControl.Applicative
ですか? do
ブロックの最後でもpure
を使用できるようですか?'返品'と '純粋'の差
他の人よりも優先する必要がある状況はありますか(誰もがブロックの末尾にreturn
が必要です)。
GHC 7.8以前では、Applicative
はMonad
のスーパークラスではありませんでした。 Monad
インスタンスにApplicative
インスタンスを持たないことも可能でした。しかし、pure
とreturn
は、両方のインスタンスである型に対して同じ動作をする必要があります。 Functor-Applicative-Monad ProposalにGHC 7.10で
、Applicative
は現在Monad
(class Applicative m => Monad m
)のスーパークラスであり、それは今pure
とreturn
すべてMonad
インスタンスで同じでなければならないルールです。実際、return
の既定の実装は、the source on hackageに示すように、pure
になりました。
pure
は、という制約がありません。Applicative
という制約があり、関数がより一般的になるため、return
よりも優先される可能性があります。 return
は、歴史的な前例のために表記でpure
よりも好ましい場合がありますが、pure
を使用してもまったく同じ効果が得られます。
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
はreturn
はMonad
するf
を必要とするので、型チェックはありません。
他の回答は受け入れられていましたが、以前は本当に好きでした –
違いはありませんが、どちらも歴史的な理由から存在します(「Monad」は常に「Applicative」のスーパークラスではありませんでした)。 '純粋な'に 'return 'をエイリアスする提案があります。 – Lee
明確にするために、あなたが 'Monad'を扱っていることを知っていれば、それらは同じです。 'pure'は' Applicative'を返す 'return'よりも一般的です。あなたは' return'のすべてのインスタンスを 'pure'で置き換えることはできませんが、' pure'を 'return'で置き換えることができます。 – Lee
@Lee、私はそれがあなたの2番目の文の周りの別の方法だと思います。 –