Как определить эквивалент этой функции (взятый из 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
haskell
types
ghci
function-declaration
Mattbh
источник
источник
-XNoMonomorphismRestriction
GHCi включен по умолчанию, начиная с 7.8.1: downloads.haskell.org/~ghc/latest/docs/html/users_guide/…Обратите внимание, что вы также можете избежать ограничения мономорфизма, просто добавив «точки» (т.е. явные переменные) обратно в ваше выражение. Таким образом, это также дает правильный тип:
источник
В Руководстве пользователя GHC показаны два дополнительных способа достижения этого. В этом подразделе представлена конструкция
:{
...:}
, которую можно использовать следующим образом:> :{ | numUniques :: (Eq a) => [a] -> Int | numUniques = length . nub | :}
Как вариант, вы можете включить многострочный режим :
> :set +m > let | numUniques :: (Eq a) => [a] -> Int | numUniques = length . nub |
источник