Я читаю отличную статью Понимаю карту и применяю Скотта Влашина и запускаю некоторый код Haskell, чтобы понять концепции (Functor
, Applicative
, ...). Я наткнулся на поведение, которое я не понимаю.
Почему оценка pure add1
ничего не печатает? Каково значение оцененного выражения? Почему pure add1 "abc"
возвращает мне функцию add1
?
Я понимаю, что pure
поднимает значение в возвышенный мир (так называется в статье). Поскольку я не предоставляю конкретное поднятое значение где-либо или недостаточно информации о типе, ограничение типа является общим и остается Applicative f
. Таким образом, я понимаю тип pure add1
. Но остальное из того, что здесь происходит, ускользает от меня.
$ stack ghci
GHCi, version 8.8.2
λ: add1 :: Int -> Int ; add1 x = x + 1
λ: :t add1
add1 :: Int -> Int
λ: add1 100
101
λ: :t pure
pure :: Applicative f => a -> f a
λ: pure add1
λ: :t pure add1
pure add1 :: Applicative f => f (Int -> Int)
λ: pure add1 "abc"
<interactive>:8:1: error:
• No instance for (Show (Int -> Int)) arising from a use of ‘print’
(maybe you haven't applied a function to enough arguments?)
• In a stmt of an interactive GHCi command: print it
λ: :t pure add1 "abc"
pure add1 "abc" :: Int -> Int
λ: pure add1 "abc" 100
101
РЕДАКТИРОВАТЬ Я думаю, что два комментария @chi и ответ @sarah отвечают на вопрос, потому что он показывает аппликатив, выбранный GHCi для оценки выражения, и это объясняет наблюдаемое поведение.