Haskell Book、「第22章リーダー」でエクササイズができません。演習では、「リーダーのためのApplicativeを実装」と言うと、それは次のようになります:Readerのアプリケーションインスタンスを書き込むときに<*>を書き込む方法
{-# LANGUAGE InstanceSigs #-}
newtype Reader r a =
Reader { runReader :: r -> a }
instance Applicative (Reader r) where
pure :: a -> Reader r a
pure a = Reader $ ???
(<*>) :: Reader r (a -> b) -> Reader r a -> Reader r b
(Reader rab) <*> (Reader ra) = Reader $ \r -> ???
私はそうGHCはありません「文句れたので(私は、Functor
インスタンスを書いてもFunctor
インスタンスを書き込んだ後pure
を書くことができました「‘Applicative (Reader r)’
のインスタンス宣言では、インスタンス宣言のスーパークラスから生じる(Functor (Reader r)) …
)のインスタンス:
{-# LANGUAGE InstanceSigs #-}
newtype Reader r a =
Reader { runReader :: r -> a }
instance Functor (Reader r) where
fmap f (Reader x) = Reader (f . x)
instance Applicative (Reader r) where
pure :: a -> Reader r a
pure a = Reader $ \_ -> a
(<*>) :: Reader r (a -> b) -> Reader r a -> Reader r b
(Reader rab) <*> (Reader ra) = Reader $ \r -> ???
しかし、私は???
部分でこだわっています。私たちは、あなたが何をする必要があるかを説明 よ、適用する関数の定義があなたのために始めました
、あなたがコードを書く:
本は、以下のヒントを提供します。上記のReader's applyのタイプ を解凍すると、次のようになります。
<*> :: (r -> a -> b) -> (r -> a) -> (r -> b) -- contrast this with the type of fmap fmap :: (a -> b) -> (r -> a) -> (r -> b)
だから違いは何ですか?違いは
apply
で、fmap
と異なり、r
という引数もあります。
はい、どうすればいいですか? 型付き穴を使用すると、コンパイラは???
の型がb
である必要があることを通知します。しかし、私はまだr
を受け取り、タイプb
、rab
とra
を返すラムダ式をどのように構築できるか分かりません。
また、その本を購入しない私たちのために、「リーダー」データタイプの定義を提供できますか? –
@Rhymoidこれは少し厳しいです。 「リーダー」とは、結局のところ一般的な知識です。 – duplode
申し訳ありませんが、Readerタイプが見つからないため、上記の質問に追加しました。 –