2015-12-10 9 views
6

Tutti sanno che il modo elegante per esprimere numeri naturali su linguaggi funzionali dipendente tipizzati:Come si formalizza la torre numerica sui linguaggi funzionali?

data Nat = Zero | Succ Nat 

Integer, Frazione, reale, Complex e Quaternion sono, anche, molto importante per l'applicazione pratica di programmazione. li si potrebbe implementare come:

data Integer = Integer (sign : Bool) (modulus : Nat) 
data Fraction = Fraction (dividend : Nat) (divisor : Nat) 
data Real  = Real (exponent : Integer) (fraction : Nat) 
data Complex = Complex Real Real 
data Quaternion = Quaternion Real Real Real Real 

Ma nessuno di quelli davvero riflettere la reale struttura di/natura dei loro tipi di significato come Nats fanno. L'intero non è isomorfo rispetto agli interi effettivi, ad esempio (poiché Zero si verifica due volte). Reals ha bisogno di più di un milione di celle per memorizzare (3.141592), ma nemmeno di 100 per memorizzare (4096), che sembra sbilanciato. Complex è solo una tupla di Reals, che non riflette in realtà ciò che è un Complesso. Mi chiedo qual è il modo naturale ed elegante per esprimere la torre numerica sui linguaggi di programmazione funzionale?

+0

Ho già fatto domande simili, ma penso che nessuno sia mai arrivato con una soluzione abbastanza buona. – MaiaVictor

+6

Perché non pensi che "rispecchi accuratamente ciò che è un" Complesso "? (Detto questo, il tuo 'Real' include solo valori decimali finitamente lunghi, che è un sottoinsieme rigoroso dei razionali.) Voglio dire, suppongo che potresti rappresentarlo come il vero polinomio mod x^2 + 1, ma non è chiaro me, quale è la tua obiezione. –

+2

Matematicamente parlando, non esiste una "struttura fondamentale" di qualcosa di diverso da ciò che selezioniamo, e se ci piace possiamo mostrare che due strutture diverse sono equivalenti e le usano in modo intercambiabile. Non c'è niente di matematico nella tua rappresentazione degli interi. –

risposta

0

Mi rendo conto che questa è una domanda vecchia e la mia risposta è in Scala piuttosto che Haskell/Idris, ma potrebbe essere interessante vedere come lo fanno in Spire. L'approccio è quello di stabilire una gerarchia di strutture algebriche (ad esempio, Semigroup/Group/Ring/Field/ecc.) E quindi istanziare tipi numerici in cima a quelli, aggiungendo vari algoritmi da metodi numerici. Sono sicuro che si potrebbero trovare alcune idee utili in là.

Problemi correlati