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