Почему GHCi странно печатает это утверждение?

Отвечая на вопрос о stackoverflow, я заметил, что GHCi (интерактивный) назначает слишком строгий тип в операторе let. А именно, учитывая код,

import Control.Arrow
f = maximum &&& id >>> fst &&& (\(m,l) -> length $ filter (==m) l)

(как и в моем ответе на https://stackoverflow.com/questions/6281813/maximum-of-list-and-count-of-repeat-maximum-number/6283594#6283594), если вставить «let» перед f и ввести это в ghci, он дает следующую информацию о типе

Prelude Control.Arrow> :t f
f :: [()] -> ((), Int)

тогда как простой запрос типа выражения дает правильный результат, а именно Ord a => [a] -> (a, Int). Я использую ghc 7.0.3.


person gatoatigrado    schedule 08.06.2011    source источник


Ответы (1)


См. расширенные правила по умолчанию, используемые в GHCi. для объяснения того, откуда берется ().

Что касается того, почему в этом случае происходит дефолт, сравните следующее:

> let f x = maximum &&& id >>> fst &&& (\(m,l) -> length $ filter (==m) l) $ x
> :t f
f :: (Ord a) => [a] -> (a, Int)

Я предполагаю, что это как-то связано с мономорфностью привязок, но я не уверен в деталях.

person C. A. McCann    schedule 08.06.2011
comment
Действительно так. Запуск GHCi с -XNoMonomorphismRestriction дает тот же результат. - person hammar; 08.06.2011
comment
@hammar: Спасибо, хороший улов! По какой-то причине мне не пришло в голову попробовать это, и я не был уверен, может ли GHCi иметь другое особое поведение для привязок в REPL. - person C. A. McCann; 08.06.2011