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

72
задан mattbh 22 June 2010 в 12:38
поделиться

2 ответа

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

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

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

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

93
ответ дан 24 November 2019 в 12:44
поделиться

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

let numUniques x = length. nub $ x

13
ответ дан 24 November 2019 в 12:44
поделиться
Другие вопросы по тегам:

Похожие вопросы: