Pergunta

Estou começando Haskell...Tentei escrever a seguinte função trivial de duas maneiras diferentes, deixando Haskell decidir os tipos, e o sistema de tipos faz algo diferente em cada caso.Qual é a explicação para esse comportamento?

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

Obrigado!

Foi útil?

Solução

Isto é conhecido como restrição de monomorfismo.

Basicamente, isso significa que ligações de nível superior que se parecem x = são forçados a ser não polimórficos, a menos que você especifique uma assinatura de tipo.Ligações com argumentos, ou seja, f x = não são afetados.Consulte o link para obter detalhes sobre o motivo da existência dessa restrição.

Normalmente, você recebe uma mensagem de erro quando a restrição é aplicada, mas neste caso o GHCi é capaz de usar o tipo padrão para alterar o tipo Num a => a para Integer.

A maneira mais fácil de evitar isso é usar uma assinatura de tipo explícita ou colocar

{-# LANGUAGE NoMonomorphismRestriction #-}

na parte superior do seu módulo ou execute o GHCi com -XNoMonomorphismRestriction.

Outras dicas

Como outros apontaram, isso é causado por algo chamado "Restrição ao Monomorfismo".

MR pode ser útil para escritores de compiladores Haskell, e há controvérsia sobre se vale ou não a pena tê-lo na linguagem em geral.Mas há uma coisa que todos concordam:no prompt do GHCi, MR nada mais é do que um incômodo.

O MR provavelmente será desativado por padrão neste contexto em uma versão futura do GHC.Por enquanto, você deve desativá-lo no GHCi criando um arquivo de texto chamado ".ghci" no seu diretório inicial que contém uma linha como esta:

:set -XNoMonomorphismRestriction

Porque a definição de g não nomeia explicitamente seus argumentos, você se depara com o restrição de monomorfismo, impedindo g de ser polimórfico e (neste caso) fazer com que o GHC seja padronizado para Integer.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top