STrans : (m : Type -> Type) ->
(result : Type) ->
(inRes : Resources) ->
(outRes : result -> Resources) ->
Type
Вы видите, что входные ресурсы не зависят от результата вычисления, но выходные ресурсы делают.Теперь, скажем, у нас есть
MyResultType : Type
myResult : MyResultType
Какого типа pure myResult
?Это STrans m MyResultType (f myResult) f
.Каковы входные ресурсы?f myResult
, который может быть чем угодно.Каковы выходные ресурсы?Ну, это зависит от результата.Но это pure
, поэтому результат всегда myResult
, поэтому выходные ресурсы также равны f myResult
.Вы видите, что подпись pure
говорит о том, что ресурсы ввода и вывода могут быть чем угодно, и что «что угодно» зависит от f
и myResult
, но они должны быть одинаковыми «что угодно», несмотря ни на что.
Я считаю, что эквивалентный способ увидеть тип pure
- это
pure' : (result : ty) -> STrans m ty resources (const resources)
Что, вероятно, более понятно.Я не знаю, почему эта подпись не используется.