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?

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.


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.


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-


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
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.