Странное поведение чистого от Applicative в GHCi - PullRequest
4 голосов
/ 08 марта 2020

Я читаю отличную статью Понимаю карту и применяю Скотта Влашина и запускаю некоторый код 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 для оценки выражения, и это объясняет наблюдаемое поведение.

1 Ответ

5 голосов
/ 08 марта 2020

Поскольку вы применяете выражение pure add1 к значению "abc", экземпляр Applicative выбирается как экземпляр для (->) String. В этом случае pure = const, таким образом, ваше окончательное выражение будет const add1 "abc", равным add1, которое не имеет экземпляра Show!

...