Как обеспечить явные объявления типов для функций при использовании GHCi? - PullRequest
71 голосов
/ 22 июня 2010

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

Ответы [ 2 ]

92 голосов
/ 22 июня 2010

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

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

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

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

13 голосов
/ 22 июня 2010

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

let numUniques x = length.кусочек $ x

...