Да. Давайте посмотрим на типы:
fmap :: Functor f => (a -> b) -> f a -> f b
(++) :: [a] -> [a] -> [a]
так
fmap (++) :: Functor f => f [a] -> f ([a] -> [a])
fmap
принимает функцию 1 арности. Однако в Haskell функция с 2 арностями - это просто функция с 1 арностью, которая возвращает другую функцию с 1 арностью:
([a] -> [a] -> [a]) ~ ([a] -> ([a] -> [a]))
твой fmap (++) :: Maybe [a] -> Maybe ([a] -> [a])
Если вы передадите Nothing
, он вернет Nothing
. Если вы передаете Just "foo"
(например), он возвращает Just
функцию, которая принимает строку и добавляет к ней "foo"
:
Prelude> Just f = fmap (++) $ Just "foo"
Prelude> f "bar"
"foobar"
Причина, по которой вы получаете ошибку, в том, что GHCi пытается распечатать вывод, то есть вывод должен реализовывать класс типов Show
. show
пытается Nothing :: Maybe ([a] -> [a])
. Система типов не знает, что она просто должна печатать Nothing
, все, что она знает, это то, что она не может show
и [a] -> [a]
. Так что печатает ошибку.