Как предоставить явные объявления типов для функций при использовании 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