Вы неправильно поняли то, что говорил автор.
... любая функция с того же полиморфного типа, что и fmap
...
Это означает, что любая функция с подписью
Functor f => (a -> b) -> f a -> f b
должна быть эквивалентна fmap
.(Если, конечно, вы не разрешите нижние значения.)
Это утверждение верно;это можно увидеть довольно легко, если вы попытаетесь определить такую функцию: поскольку вы ничего не знаете о f
, за исключением того, что это функтор, единственный способ получить значение, отличное от 101 f b
, - это fmapping поверх f a
один.
Немного менее очевидным является логическое следствие в цитате:
есть только один способ превратить любой заданный параметризованный тип в функтор, и следовательно любая функция с тем же полиморфным типом, что и fmap, должна быть равна fmap.
Я думаю, что автор имеет в виду, что функция Functor f => (a -> b) -> f a -> f b
обязательно должна вызывать fmap
,и поскольку fmap
всегда является единственным действительным отображением функтора для параметризованного типа, любой Functor f => (a -> b) -> f a -> f b
на практике будет также действительно подчиняться законам функтора, т. е. будет fmap
.
Я согласен с тем, что слово «следовательно» немного неверно сформулировано, но в принципе цитата верна.