ZiggiPop
@ZiggiPop
Linux Admin / Frontend Developer

Какой тип имеет первое (левое) вхождение оператора в выражении succ succ «abc»?

Пару месяцев назад достаточно успешно прошел первую часть курса «Функциональное программирование на языке Haskell» от Stepik, недавно взялся за вторую часть, и «сломался» на первом же задании:

В модуле Data.Functor определен оператор <$>, являющийся инфиксным аналогом функции fmap:

GHCi> :info <$>
(<$>) :: Functor f => (a -> b) -> f a -> f b
        -- Defined in `Data.Functor'
infixl 4 <$>


В выражении succ <$> "abc" этот оператор имеет тип (Char -> Char) -> [Char] -> [Char]. Какой тип имеет первое (левое) вхождение этого оператора в выражении succ <$> succ <$> "abc"?


Бьюсь над этим вопросом уже, наверное, неделю и уже начинаю себя чувствовать идиотом, но до сих пор так и не нашел правильного ответа даже не смотря на подсказки в обсуждении (https://stepik.org/lesson/28880/step/4?unit=9912).

Объясните "на пальцах", пожалуйста, как ответить на этот вопрос правильно, и главное — как прийти к правильному ответу. Самооценка и так уже упала ниже плинтуса.
  • Вопрос задан
  • 244 просмотра
Решения вопроса 2
@mlyamasov
Раз оператор (<$>) infixl, то исходное выражение эквивалентно следующему:
(succ <$> succ) <$> "abc".
Следовательно (succ <$> succ) имеет тип (Char -> Char).
Следовательно вторая и первая функции succ в скобках имеют тип (Char -> Char).
Следовательно ответ: (Char -> Char) -> (Char -> Char) -> (Char -> Char).

Обратите внимание на следующий instance:
instance Functor ((->) r) where
    fmap = (.)
Ответ написан
myjcom
@myjcom
(Char -> Char) -> (Char -> Char) -> Char -> Char

succ <$> succ <$> "abc" 
fmap (succ . succ) "abc"

let f = fmap succ "abc" 
let f' = fmap succ f

Enum a => (a -> a) -> (a -> a) -> a -> a
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы