Differenza tra classi Python e typeclass Haskell

2

Sono uno sviluppatore intermedio di Python e sto appena iniziando con Haskell. Sembra che le classi di Python possano essere usate in un modo simile a come sono usati i typeclass di Haskell. Sembra che i typeclass siano solo un modo per implementare l'overloading dell'operatore. In questo modo:

# main.py
class MyClass:
    def __init__(self, num, name):
        self.num = num
        self.name = name

    def __str__(self):
        return self.name

    def __radd__(self, other):
        self.num + other

    def __add__(self, other):
        self.num + other

Ora quando fai qualcosa di simile

# main.py
c = MyClass(1, 'hello')
c2 = MyClass(2, 'foo')

str(c) # 'hello'
sum([c, c2]) # 3

Ora consente di confrontare questo con Haskell:

-- main.hs
data MyClass = Foo | Bar

instance Show MyClass where
    show Foo = "foo"
    show Bar = "hahahahaha"

Ora posso fare qualcosa del tipo:

show Bar -- "hahahaha"

La conoscenza del mio novizio (nella migliore delle ipotesi) mi dice che l'unico vantaggio dell'utilizzo di Haskell (se si confrontano solo queste due caratteristiche linguistiche) è che il programmatore Haskell è in grado di definire n "operatori" da sovraccaricare mentre Python ha un elenco fisso

Ma questa non può essere l'intera storia. Quali sono le altre differenze? Cosa mi manca qui?

    
posta dopatraman 24.03.2016 - 22:55
fonte

1 risposta

8

Una differenza: in Python, puoi definire una sottoclasse MySubclass di MyClass , e quindi puoi liberamente aggiungere oggetti di MyClass con oggetti di MySubclass .

Haskell tende ad evitare la sottotitolazione: se si ha una classe di esempi Addable con una funzione add :: Addable a => a -> a -> a , entrambi gli estremi devono sempre essere dello stesso tipo . Può essere di qualsiasi tipo che sia un'istanza di Addable , ma deve essere uguale per entrambi i summit e il risultato.

Un'altra differenza: in Haskell puoi "retroattivamente" rendere un tipo un'istanza di un typeclass. Ad esempio è possibile creare un typeclass e dichiarare le istanze per alcuni tipi preesistenti che si adattano allo stampo. In Python, quando definisci una classe devi elencare le classi che estenderà.

Ancora un'altra differenza: in Python, "metodo dispatch" (quale implementazione del metodo viene effettivamente eseguita in un'invocazione) viene determinato dall'oggetto che riceve l'invocazione. I typeclasses Haskell consentono di inviare il tipo di ritorno previsto di una funzione. Un esempio classico è la funzione read :: Read a => String -> a . A seconda del tipo desiderato a del risultato, verranno chiamate diverse funzioni di lettura.

Questo un bel discorso su Haskell typeclass che, dal minuto 40 in poi, li confronta con le interfacce OO.

    
risposta data 25.03.2016 - 00:08
fonte

Leggi altre domande sui tag