Как я определяю эквивалент этой функции (взятый от 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
Есть ли способ предоставить объявления типов в GHCi?
let numUniques' :: (Eq a) => [a] -> Int; numUniques' = length . nub
Или есть другой способ определить такие функции, которые не требуют объявления типов?
Если вы отключите ограничение мономорфизма с помощью -XNoMonomorphismRestriction
, он определит правильный тип.
Обратите внимание, что вы также можете избежать ограничения мономорфизма, просто добавив «точки» (т.е. явные переменные) обратно в ваше выражение. Таким образом, это также дает правильный тип:
let numUniques x = length. nub $ x