Почему GHCi вводит это утверждение странным образом?
Отвечая на вопрос о stackru, я заметил, что GHCi (интерактивный) назначает слишком ограничительный тип в операторе let. А именно, учитывая код,
import Control.Arrow
f = maximum &&& id >>> fst &&& (\(m,l) -> length $ filter (==m) l)
(как и в моем ответе на https://stackru.com/questions/6281813/maximum-of-list-and-count-of-repeat-maximum-number/6283594), если кто-то вставляет "let" перед f
и вводит это в ghci, он дает следующую информацию о типе
Prelude Control.Arrow> :t f
f :: [()] -> ((), Int)
тогда как простой запрос типа выражения дает правильный результат, а именно Ord a => [a] -> (a, Int)
, Я использую GHC 7.0.3.
1 ответ
См. Расширенные правила по умолчанию, используемые в GHCi для объяснения того, где ()
идет от.
Что касается того, почему по умолчанию происходит в этом случае, сравните следующее:
> let f x = maximum &&& id >>> fst &&& (\(m,l) -> length $ filter (==m) l) $ x
> :t f
f :: (Ord a) => [a] -> (a, Int)
Я предполагаю, что это как-то связано с мономорфностью привязок, но я не уверен в деталях.