Почему GHCi странно печатает это утверждение? - PullRequest
9 голосов
/ 08 июня 2011

Отвечая на вопрос о стековом потоке, я заметил, что 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.

1 Ответ

10 голосов
/ 08 июня 2011

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

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

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

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

...