Я собираюсь представить следующую статью: " Монадные трансформаторы шаг за шагом". В разделе 2.1 "Преобразование в монадический стиль" функция преобразуется для возврата Value
в монаду Eval1
. Эта часть функции не имеет смысла для меня:
eval1 env (Var n) = Map.lookup n env
Результатом этого будет Maybe Value
однако сигнатура типа функции:
eval1 :: Env → Exp → Eval1 Value
Функция не может проверить тип, и ошибка кажется мне очевидной. Тем не менее, автор специально заявляет, что это будет работать:
... случай Var больше не нуждается в вызове fromJust: причина в том, что Map.lookup определен для работы в любой монаде, просто вызывая функцию сбоя монад - это прекрасно согласуется с нашей монадической формулировкой.
Подпись для Map.lookup не выглядит так, как будто она предназначена для работы с любой монадой:
lookup :: Ord k => k -> Map k a -> Maybe a
Эта статья устарела или я что-то упустил? Если статья на самом деле устарела, то почему lookup
был изменен, чтобы работать только с Maybe
.
Спасибо!