2011-07-25 12 views
10

Questo probabilmente non è possibile, dal momento che ho già controllato l'elenco di tutte le estensioni GHC e questo non è lì, ma ho pensato di chiederlo per ogni evenienza.In Haskell posso rendere i valori letterali numerici non polimorfici di default?

C'è un modo per fare in modo che 2 è di tipo Int (o Integer) piuttosto che il solito Num a => a?

(La ragione per cui mi piacerebbe questo comportamento è che rende più chiari i messaggi di errore e più probabile che sia possibile l'inferenza (specialmente con classi di tipi) Potrei sempre scrivere (2 :: Int) ovunque ma vorrei piuttosto il comportamento "più sicuro" è quello meno esplicito)

+1

sì, non farlo :) l'inferenza di tipo di solito non è poi così male. forse se pubblichi un problema di esempio, le persone possono aiutarti a risolverlo in un modo diverso? puoi impostare i valori predefiniti tramite http://www.haskell.org/tutorial/numbers.html. puoi anche sviluppare prototipando i tipi di funzioni di primo livello impostandole su 'f = undefined :: DesiredType', e svuotale in modo appropriato. – gatoatigrado

+0

Le costanti polimorfiche non mi impediscono di fare nulla, ma rendono i messaggi di errore meno diretti, di solito cambiando un "non può corrispondere al tipo atteso ..." a "nessuna istanza per ...". Di default non ti permettono di dedurre un'istanza per una classe (e sentiti come un po 'di hacking) – Owen

risposta

13

C'è un modo (leggermente offensivo e scomodo) per farlo usando le estensioni GHC.

{-# LANGUAGE RebindableSyntax #-} 

import qualified Prelude as P 
import Prelude hiding (Num(..)) 

fromInteger :: Integer -> Integer 
fromInteger = id 

In GHCi:

> :set -XRebindableSyntax 
> :t 2 
2 :: Integer 

Con l'estensione RebindindableSyntax abilitato, GHC userà qualunque fromInteger è portata per gestire letterali numerici. L'unico vincolo è che deve prendere un argomento di tipo Integer (in realtà, anche questo non è richiesto, ma se non si ottiene un errore di tipo da letterali numerici).

Si noti che, poiché lo standard fromInteger fa parte della classe Num, potrebbe essere necessario modificare alcune cose per far funzionare correttamente le cose.

+1

Hmm, forse è meglio nascondere solo daInteger': 'importa Prelude hiding (Num (fromInteger))' – luqui

+0

Grazie ! Ho provato questo e ottiene esattamente il comportamento che voglio ... anche se è un po 'prolisso (rende anche aritmetico scomodo ma non faccio mai aritmetica comunque). – Owen

+0

@luqui: Forse. Non sono sicuro della parte superiore della mia testa se nascondendo solo quello avrebbe risultati strani usando altre funzioni in 'Num'. –

4

Penso che dovrei aggiungere "default()" a queste risposte, anche se penso che gatoatigrado ne abbia parlato di sfuggita. Lo standard Haskell 98 ha un section 4.3.4 che alla fine descrive come modificare lo di default Num a => a valori. L'ordine predefinito implicito è dato da

default (Integer, Double) 

e può essere modificato, ad es. mettendo

default (Int) 

o

default() 

nel file di origine.

Problemi correlati