Переопределить IO, чтобы упростить отладку? - PullRequest
14 голосов
/ 11 марта 2012

Я просматривал слайды в http://www.algorithm.com.au/downloads/talks/monads-are-not-scary/monads-are-not-scary-chak.pdf

и ок.На 75% пути через колоду есть пункт «Переопределить ввод-вывод для упрощения отладки!»

Это выглядит очень интригующей идеей!Может кто-нибудь привести практический пример того, о чем говорит говорящий?

1 Ответ

10 голосов
/ 11 марта 2012

Ну, а что если вместо ввода-вывода вы использовали монаду, которая имитирует ввод-вывод в идеально контролируемой и оговоренной среде?Вы можете легко проверить эти действия "IO", как будто они были чистыми функциями.Это идея, к примеру, IOSpec , которая идет еще дальше, позволяя вам точно указать, какой эффект вы хотите разрешить в своем имитируемом вводе-выводе, вы можете написать:

myFunction :: a -> b -> IOSpec (Teletype :+: IORefS)
myFunction x y = do
  ...
  putStr (...)
  ref <- newIORef ...
  ...

(телетайп разрешает функции терминала, IORefS - ссылки). Затем протестируйте свою функцию, например, в свойстве быстрой проверки (см. модуль VM и runIOSpec) с полным контролем над вводом и выводом или даже пошагово в GHCI.И если он работает правильно, просто измените импорт, чтобы ввести Test.IOSpec.Surrogate, который переопределяет IOSpec f в качестве синонима для IO.

...