2017-02-07 16 views
0

私は、現時点では、読者のモナドをカバーしています、と私はrunReaderに遭遇しました:レコード構文内で定義された関数インタフェースの実装?

newtype Reader e a = Reader {runReader :: (e -> a)} 

私はここにデータコンストラクタReaderがに渡されるために、2つの異なる種類(ea)を有効にしていることを理解しますレコード構文を使用してのeおよびaで動作する型コンストラクタReader

私はこれのテストを実施しようとしている:

newtype Test a b = Test {runTest :: (a -> b)} 

にはどうすればrunTestの実装の作成について行くのですか?

+0

他のデータ型と同じように、正しい型の引数を渡してください! 'Test id :: Test aa'、' Test(\ b-> bならばNothing else()):: Test Bool(Maybe()) 'など – Alec

+0

このコメントは建設的ではない - canあなたは説明してください? –

+2

私が誠実ではない、それは意図ではなかったと私は謝罪します。私の指摘は、 'runTest'に特有の名前がついていても、まだ' test'を作るためのフィールドであり、 'runTest'フィールドを埋めるために関数に渡したということです。その関数は 'runTest'の"実装 "です。 – Alec

答えて

2

t :: Test a b 

はその後

runTest t :: ? 

まあ、はい、runTest t :: a -> bの種類は何である場合。これは、aからbまでの関数と事実上同じです。同様に、Reader e aは事実上、最初の引数としてeを持つ関数です。

あなたは実装について尋ねましたが、私はReader Monadの実装方法を想定していますか? Readerのモナドの実装では、すべてが最初の引数としてeを持つ複数の関数を作成し、それらのすべての最初の入力に単一のeを配布するように処理します。 eがあなたの関数への入力になります(runReader r) :: e -> a

私はここにトラックを実行している場合は私に知らせて、私は少し読者のモナドを肉体を尽くすだろうか分からない。

関連する問題