2012-11-04 9 views
5

Eventuali duplicati:
Comparing functions in Haskellfunzioni e parametri confrontare in Haskell

sto imparando Haskell, voleva sapere è qualcosa di simile possibile? Tutto ciò che voglio è confrontare se il parametro 'funzione' è uguale a una delle funzioni a o b. Come fare questo?

codice Esempio:

a,b :: Integer -> Integer 
a x = x+1 
b x = x-1 

c function parameter = if function == a 
      then ... parameter -- Do a related stuff 
      else ... parameter -- Do b related stuff 
+0

Non sono un esperto di Haskell, ma per utilizzare la funzione '(==)' i parametri devono far parte della classe di caratteri 'Eq', e non penso che le funzioni possano far parte di typeclass. –

+6

Da [questa risposta] (http://stackoverflow.com/a/4328965/195701): _'Non è, e non sarà mai, un modo per confrontare due funzioni per l'uguaglianza. C'è una prova matematica che non è possibile in generale. _ – Miguel

+0

@VincentSavard: istanza Num b => Num (a -> b) dove (f + g) x = fx + gx - ... – Fixnum

risposta

2

L'unico caso che conosco dove è possibile confrontare due funzioni per l'uguaglianza è se il loro dominio ha un numero finito di valori. Ad esempio, se si hanno due funzioni di tipo:

f, g :: Bool -> A 

allora sono uguali se sono uguali per tutti gli ingressi:

f == g = (f False == g False) && (f True == g True) 

Tuttavia, per il caso di Int, confrontandoli ogni possibile valore di Int non è pratico e inefficiente. Per Integer, non può essere eseguito poiché Integer s non sono limitati.

Come @Miguel ha correttamente sottolineato nel suo commento, le funzioni con domini non limitati non possono essere confrontate per l'uguaglianza in generale.