Не забудьте универсальные количественные показатели.
Рыба (>=>)
имеет тип (a -> Writer b) -> .....
для любых a
и b
.
id
имеет тип a -> a
для любого a
.
Следовательно, в частности, рыба также имеет тип (Writer b -> Writer b) -> ...
для любого b
(просто возьмите a = Writer b
в качестве специальногоcase).
Кроме того, id
также имеет тип Writer b -> Writer b
(опять же, как особый случай).
«Хитрость» заключается в том, чтобы «объединить» два типа, используя унификация .Мы начинаем с требования (a -> Writer b) = (a' -> a')
, а затем выводим a = a'
и Writer b = a'
.Отсюда мы видим, что эти два типа могут быть объединены, поэтому в передаче аргументов нет никакого противоречия.
(Также обратите внимание, что здесь мы переименовали a
в типе id
в a'
во избежание путаницы с другими a
для рыбы)