Я использую GHCi (версия 6.12.3), чтобы немного поиграть с Haskell.Недавно я читал о функторах и аппликативных функторах, которые думали, что если вы не могли бы реализовать нечто подобное <*>
аппликативных функторов, используя только примитивы функтора.После некоторых размышлений я придумал fmap fmap
, который имел бы (почти) идеальный тип
Functor f => f (a -> b) -> f (f a -> f b)
или более обобщенно
(Functor f1, Functor f2) => f1 (a -> b) -> f1 (f2 a -> f2 b)
Я пытался
let q = fmap fmap
Я получил следующую ошибку
<interactive>:1:8:
Ambiguous type variable `f1' in the constraint:
`Functor f1' arising from a use of `fmap' at <interactive>:1:8-16
Probable fix: add a type signature that fixes these type variable(s)
<interactive>:1:13:
Ambiguous type variable `f' in the constraint:
`Functor f' arising from a use of `fmap' at <interactive>:1:13-16
Probable fix: add a type signature that fixes these type variable(s)
Запись вышеуказанной сигнатуры типа в соответствии с предложением не помогла.Сумасшедшая вещь, когда я набрал :t fmap fmap
Я получил эквивалентный тип, как указано выше.
Что я делаю не так?Почему fmap fmap
выдает ошибку типа, хотя GHCi находит для нее тип?