Questa domanda ha una sottile "no ma sì" tipo di risposta, che richiede di andare in tre concetti:
- nomi qualificati vs. nomi non qualificati
- moduli e le importazioni
- Aliasing
Punto 1: ogni definizione in Haskell ha un nome breve e non qualificato come map
e un nome lungo e qualificato come Data.List.map
.
Punto 2: quando si importa un modulo in un altro, è possibile eseguire un'importazione qualificata o non qualificata. Quando si utilizza un'importazione non qualificata, i nomi dei moduli esterni che si inseriscono verranno sottoposti a alias sotto i loro nomi brevi. Quando si esegue un'importazione qualificato, saranno disponibili solo con un nome modificato:
import qualified Data.Map as Map
Ora, nel modulo in cui questo è apparso, la funzione Data.Map.map
è visibile sotto lo pseudonimo Data.map
.
Terzo punto: ciò significa che ogni definizione Haskell ha un nome completo determinato dal suo nome breve e dal modulo in cui è definito, ma anche da alias non qualificato o parzialmente qualificato in ogni modulo in cui viene importato.
Ora, la tua domanda ha due risposte:
- due classi diverse non possono avere metodi che condividono lo stesso completo nome. Pertanto, se si definiscono le classi
Foo
e Bar
nello stesso modulo, ciò non riuscirà.
- due classi diverse possono avere metodi che condividono lo stesso nome non qualificato , finché i loro nomi completi sono diversi-cioè., Sono definite in diversi moduli. Per utilizzare entrambi all'interno di un modulo client, tuttavia, sarà necessario almeno un'importazione qualificata in modo che gli alias dall'importazione non entrino in conflitto.
fonte
2015-09-14 20:07:51
In OOP, i metodi con lo stesso nome sono consentiti perché il tipo dell'oggetto 'this' può essere disambiguo tra loro. In Haskell, non c'è 'this' around: metodi per' Foo a' non implicitamente accettano un argomento 'a'. Anche se lo facessero, digitare l'inferenza diventerebbe piuttosto complicato, dal momento che è necessario calcolare il tipo di "questo" _prima_ si può conoscere il tipo del metodo. Nella maggior parte dei linguaggi OOP, non c'è o nessuna inferenza di tipo w.r.t. lingue funzionali, quindi questo non è un problema lì. – chi
Inoltre, queste sono funzioni non metodi, per la precisione. –
@Erik Alik: In realtà, anche se è molto diverso dal concetto OO, [la parola 'metodo' è tecnicamente corretta] (https://www.haskell.org/onlinereport/haskell2010/haskellch4.html#x10-750004.3) . –