Это не имеет ничего общего с ghci. Это ограничение мономорфизма, являющееся раздражающим. Если вы попытаетесь скомпилировать следующий файл:
add = uncurry (+)
main = do
print $ add (1,2 :: Int)
print $ add (1,2 :: Double)
Вы получите ошибку. Если развернуть:
main = do
print $ uncurry (+) (1,2 :: Int)
print $ uncurry (+) (1,2 :: Double)
Все хорошо, как и ожидалось. Ограничение мономорфизма отказывается сделать что-то, что «выглядит как значение» (то есть определено без аргументов в левой части от равенства), типа полиморфного типа, потому что это повредит кэшированию, которое обычно происходит. Например.
foo :: Integer
foo = expensive computation
bar :: (Num a) => a
bar = expensive computation
foo
гарантированно рассчитывается только один раз (ну, по крайней мере, в GHC), тогда как bar
будет вычисляться каждый раз, когда он упоминается. Ограничение мономорфизма направлено на то, чтобы спасти вас от второго случая, если по умолчанию использовать первый, когда кажется, что это то, что вы хотели.
Если вы используете функцию только один раз (или всегда в одном и том же типе), вывод типа позаботится о том, чтобы вывести правильный тип для вас. В этом случае ghci делает что-то немного другое, угадывая раньше. Но использование его в двух разных типах показывает, что происходит.
В случае сомнений используйте сигнатуру типа (или отключите убогую вещь с помощью {-# LANGUAGE NoMonomorphismRestriction #-}
).