Como pode (-) aparentemente ter dois tipos diferentes?

12

Em ghci, quando digito

:t (-)

para descobrir o tipo de (-), ele retorna

(-) :: Num a => a -> a -> a

No entanto, quando escrevo, -1haskell retorna um número, o que parece implicar que (-)é do tipo Num a => a -> a. Como (-)aparentemente pode ter dois tipos diferentes?

TippFehler
fonte

Respostas:

15

Esta foi uma decisão de design no idioma. -1é um número, mas seu uso neste contexto é não relacionado com a função(-) . (Como Ackdari menciona em sua resposta, esse uso está relacionado à função negate.) Existem alguns compromissos que permitem que isso funcione:

  1. Você não pode pegar uma fatia certa do (-)operador. Como solução alternativa, Haskell fornece a subtractfunção.

  2. Você não pode escrever um número inteiro negativo sem parênteses, a menos que esteja no início de uma atribuição (por exemplo, diretamente após =ou ->). Isso produz um erro de análise:

    let x = 8 * -1

    Em vez disso, deve ser escrito como

    let x = 8 * (-1)

    No entanto, isso é bom:

    let x = -1 * 8

Essas foram consideradas compensações razoáveis ​​para os projetistas do idioma.

Andrew Ray
fonte
8

A resposta já está descrita no haskell-wiki , afirma

O menos unário é o açúcar sintático para a função Prelude negate

então a função (-)é sempre a a - bfunção e se você escrever um código como let x = -yo compilador o traduzirá let x = negate y.

Ackdari
fonte
7

Unário menos é especial em Haskell. Conforme declarado na seção 3.4 do relatório :

A forma especial denota negação de prefixo, o único operador de prefixo em Haskell, e é a sintaxe para . O operador binário não se refere necessariamente à definição de no prelúdio; pode ser recuperado pelo sistema do módulo. No entanto, unário sempre se refere à função definida no prelúdio. Não há ligação entre o significado local do operador e a negação unária.-enegate (e)---negate-

bipll
fonte
2
As respostas de uma frase são desencorajadas no SO, assim como os links sem um resumo de seu conteúdo, pois podem ser quebrados.
Andrew Ray
Como posso assumir que os links para relatórios / padrões também são muito pessimizados em comparação com os wikis / tutoriais / vídeos do youtube?
bipll 17/04
@bipll Sim. O problema com as respostas somente do link não é a qualidade do destino do link, mas o risco de podridão do link. Se você copiou na seção relevante do relatório, sua resposta seria adequada.
Joseph Sible-Reinstate Monica