Un concetto critico che ritengo né Dave né Peter abbiano sottolineato abbastanza: due funzioni sono uguali se e solo se (a) hanno lo stesso tipo, e (b) per ogni possibile argomento che puoi dare loro, entrambi producono lo stesso risultato.
Ora, con questo chiaro, la risposta per Eq
è proprio quello che hanno detto. Peter sottolinea che un'istanza Eq
per le funzioni dovrebbe essere in grado di analizzare due funzioni arbitrarie e determinare correttamente se producono lo stesso risultato per due input. E come sottolinea Dave, questo è in realtà matematicamente impossibile; qualsiasi correttore che ha provato a confrontare funzioni arbitrarie fallirà per alcune funzioni, il che significa che si bloccherà o produrrà una risposta errata per alcuni casi.
vedrete programmatori Haskell parlare di parità di funzioni per tutto il tempo, però, ma la maggior parte del tempo il loro significato è che gli esseri umani hanno dimostrato che alcune due funzioni sono uguali. Ad esempio, l'operatore composizione funzione è definita in questo modo:
(.) :: (b -> c) -> (a -> b) -> (a -> c)
f . g = \x -> f (g x)
Possiamo ora dimostrare che per ogni possibile h :: c -> d
, g :: b -> c
e h :: a -> b
, f . (g . h) == (f . g) . h
. E 'abbastanza facile in questo caso, abbiamo semplicemente ampliare l'espressioni secondo la definizione di (.)
, e noi ottenere la stessa cosa per entrambi:
f . (g . h) = f . (\y -> g (h y)) -- expand `g . h` by definition
= \x -> f ((\y -> g (h y)) x) -- expand `f . (\y -> g (h y))`
= \x -> f (g (h x)) -- apply the inner lambda
(f . g) . h = (\y -> f (g y)) . h
= \x -> (\y -> f (g y)) (h x)
= \x -> f (g (h x))
Ma questo può essere fatto solo per le funzioni scelti con cura, e computer in genere può Fallo bene o in modo affidabile. Per ogni programma che scrivi per provare e testare l'uguaglianza delle funzioni arbitrarie, ci saranno alcune funzioni per le quali produrranno la risposta sbagliata o il ciclo per sempre.
fonte
2013-04-05 16:37:54
Hai provato a implementarne uno? – is7s
Sì, ho. Capisco come funzionano. Ma questo non mi aiuta veramente a capire il design del linguaggio e perché è stato fatto per non essere esempi di Eq o di tipo classe Show. – AnchovyLegend
Il fatto che devi chiedere già mostra che un'istanza di 'Eq' per le funzioni sarebbe confusa a causa della semantica non chiara. Quando sono uguali le due funzioni? Cosa significherebbe? –