Как предоставить явные объявления типа для функций при использовании GHCI?

StackOverflow https://stackoverflow.com/questions/3093133

Вопрос

Как я определить эквивалент этой функции (взятой из Учитесь) Внутри 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, это будет выводит правильный тип.

Другие советы

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

Пусть числовые x = длина. nub $ x

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top