Преобразование функции в стиль без точек меняет ее тип - PullRequest
15 голосов
/ 19 мая 2011

Я начинаю Haskell ... Я пытался написать следующую тривиальную функцию двумя разными способами, позволяя Haskell определять типы, а система типов делает что-то свое в каждом случае.Чем объясняется такое поведение?

Prelude> let f x = 2 * x
Prelude> let g = (2*)
Prelude> :info f
f :: Num a => a -> a    -- Defined at <interactive>:1:5
Prelude> :info g
g :: Integer -> Integer     -- Defined at <interactive>:1:5

Спасибо!

Ответы [ 3 ]

12 голосов
/ 19 мая 2011

Это известно как ограничение мономорфизма .

По сути, это означает, что привязки верхнего уровня, которые выглядят как x =, должны быть неполиморфными, если вы не укажетеТип подписи.Привязки с аргументами, т.е. f x = не затрагиваются.Для получения подробной информации о том, почему существует это ограничение, см. Ссылку.

Обычно при применении ограничения вы получаете сообщение об ошибке, но в этом случае GHCi может использовать тип по умолчанию, чтобы изменить тип Num a => a наInteger.

Самый простой способ уклониться от этого - либо использовать явную сигнатуру типа, либо поставить

{-# LANGUAGE NoMonomorphismRestriction #-}

в верхней части вашего модуля, либо запустить GHCi с -XNoMonomorphismRestriction.

3 голосов
/ 19 мая 2011

Как уже указывали другие, это вызвано тем, что называется "ограничением мономорфизма".

MR может быть полезен для авторов компиляторов Haskell, и есть спор о том, стоит ли вообще иметь язык в целом. Но есть одна вещь, с которой все согласны: по приглашению GHCi MR - не что иное, как неприятность.

В этом контексте MR, вероятно, будет отключен по умолчанию в следующей версии GHC. На данный момент вы должны отключить его в GHCi, создав текстовый файл с именем ".ghci" в вашем домашнем каталоге, который содержит такую ​​строку:

:set -XNoMonomorphismRestriction
1 голос
/ 19 мая 2011

Поскольку определение g явно не называет его аргументы, вы сталкиваетесь с ограничением мономорфизма , не позволяющим g быть полиморфным и (в данном случае) приводящим к тому, что GHC по умолчанию принимает значение Integer.

...