Как предоставить явные объявления типов для функций при использовании GHCi?

Как определить эквивалент этой функции (взятый из learnyouahaskell) внутри GHCi?

import Data.List  

numUniques :: (Eq a) => [a] -> Int  
numUniques = length . nub  

Без объявления типа GHCi принимает определение функции, но заканчивается бесполезным типом:

Prelude Data.List> import Data.List 
Prelude Data.List> let numUniques' = length . nub
Prelude Data.List> :t numUniques'
numUniques' :: [()] -> Int

Результирующая функция принимает только список единиц в качестве параметра.

Есть ли способ предоставить объявления типов в GHCi? Или существует другой способ определения таких функций, которые не требуют деклараций типов?

Я не видел очевидных подсказок в руководстве GHCi и экспериментировал с выражениями вроде следующего (безрезультатно):

> let numUniques' = ((length . nub) :: (Eq a) => [a] -> Int)
> :t numUniques'
numUniques' :: [()] -> Int

Ответ 1

Есть ли способ предоставить объявления типов в GHCi?

let numUniques' :: (Eq a) => [a] -> Int; numUniques' = length . nub

Или существует другой способ определения таких функций, которые не требуют деклараций типа?

Если вы отключите ограничение мономорфизма с помощью -XNoMonomorphismRestriction, он выведет правильный тип.

Ответ 2

Обратите внимание, что вы также можете избежать ограничения мономорфизма, просто добавив "точки" (т.е. явные переменные) обратно к вашему выражению. Таким образом, это также дает правильный тип:

пусть numUniques x = length. nub $x