Я новичок в Haskell, но понимаю, как Monad Transformers можно использовать. Тем не менее, я все еще испытываю трудности с захватом заявленного преимущества перед передачей параметров для вызова функций.
Основываясь на wiki Разъяснение трансформаторов Monad, у нас в основном есть объект Config, определенный как
data Config = Config Foo Bar Baz
и передать его, вместо того, чтобы писать функции с этой сигнатурой
client_func :: Config -> IO ()
мы используем трансформатор ReaderT Monad Transformer и меняем подпись на
client_func :: ReaderT Config IO ()
вытаскивание Config - это просто вызов ask
.
Вызов функции изменяется с client_func c
на runReaderT client_func c
Fine.
Но почему это упрощает мое приложение?
1- Я подозреваю, что Monad Transformers заинтересованы, когда вы сшиваете много функций/модулей вместе, чтобы сформировать приложение. Но это то, где мое понимание прекращается. Может ли кто-нибудь пролить свет?
2- Я не смог найти документацию о том, как вы пишете большое приложение modular в Haskell, где модули выставляют какую-то форму API и скрывают их реализации, а также (частично) скрывают свои собственные Состояния и среды из других модулей. Любые указатели, пожалуйста?
(Edit: Real World Haskell заявляет, что ".. этот подход [Monad Transformers]... масштабируется для больших программ", но нет четкого примера, демонстрирующего это утверждение)
РЕДАКТИРОВАТЬ Следующий Крис Тейлор Отвечать ниже
Крис прекрасно объясняет, почему инкапсуляция Config, State и т.д. в Transformer Monad обеспечивает два преимущества:
- Это препятствует тому, чтобы функция более высокого уровня поддерживала в своей сигнатуре типа все параметры, требуемые функциями (под), которые она вызывает, но не обязательными для ее собственного использования (см. функцию
getUserInput
) - и, как следствие, делает функции более высокого уровня более устойчивыми к изменению содержимого трансформаторной монады (скажем, вы хотите добавить к нему
Writer
для обеспечения входа в систему с более низким уровнем)
Это связано с изменением сигнатуры всех функций, поэтому они запускают "в" трансформаторную монаду.
Итак, вопрос 1 полностью покрыт. Спасибо Крису.
Вопрос 2 теперь отвечает на этот SO-сообщение