Писав на днях сервер на Happstack, а оскільки я тоді не додумався запускати ghci із
:l Main.hs
і дивитись типи обробників і таблиць маршрутизації (всі ці ServerPartT IO Response
), то типові сигнатури я випускав, в результаті в мене вийшла програма на сотні три рядків практично без оголошень типів. Зручно? Можливо.Але коли я в одному місці забув перед
appendFile
приписати liftIO
, тайпчекер had gone wild: вирішивши, що тип серверних процедур це IO Response
, він почав викидати абсурдні повідомлення про помилки на інших, коректних процедурах, не вказуючи на реальне джерело там, де був забутий liftIO
.Після цього я таки задумався, як з’ясувати дефолтний тип, який ховається за
ServerMonad m
, FilterMonad Response m
, WebMonad
та іншими констрейтами і написати явні типові анотації.