2017-02-07 6 views
0

Я покрытие читателя монады на данный момент, и я пришел через runReader:Реализация интерфейсов функций, определенных внутри синтаксиса записи?

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

Я понимаю, что здесь конструктор данных Reader это позволяет два различных типа (e и a) должны быть переданы в конструктор типа Reader, который использует синтаксис записи, чтобы содержать функцию runReader ::, которая работает с e и a.

Я пытаюсь осуществить проверку этого:

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

Как я могу идти о создании реализации runTest?

+0

Как и для любого другого типа данных - передайте ему аргумент правильного типа! 'Test id :: Test aa',' Test (\ b -> if b then Nothing else Just()) :: Test Bool (Maybe()) 'и т. Д. – Alec

+0

@Alec этот комментарий не является конструктивным - может объясните пожалуйста? –

+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? Реализация чтения монады позволяет создавать несколько функций, у всех которых есть e в качестве первого аргумента, и обрабатывает один e для всех этих первых входов. Вводится e. Входной сигнал к вашей функции (runReader r) :: e -> a

Я не уверен, что я убегаю сюда, сообщите мне, и я получу немного читателя.

 Смежные вопросы

  • Нет связанных вопросов^_^