2015-02-19 13 views
8

Date due funzioni:inadempiente Generico in Haskell

f :: (A a, B b) => a -> b 
g :: (B b, C c) => b -> c 

Esiste un modo (in GHC) posso permettere di scrivere:

h x = g (f x) 

senza dover aggiungere una firma tipo per f x , per esempio

h x = g ((f x) :: T) 

Avendo un certo "tipo di default", che prende f x se non viene specificato?

Sospetto di aver bisogno di qualcosa come Defaulting in Haskell Prime ma è stato implementato in GHC (o in testa GHC)?

+2

Per quanto ne so, la proposta collegata non è né implementata né pianificata per GHC; e non riesco a pensare a nessun altro trucco che ti permetterebbe di evitare completamente l'aggiunta di un'annotazione di tipo. [Applicazione di tipo esplicito] (https://ghc.haskell.org/trac/ghc/wiki/ExplicitTypeApplication), che capisco sia pianificata (ma non ancora pianificata) potrebbe darti una sintassi più leggera. Ma non sono sicuro che "Non potrei pensare a niente" si qualifica veramente come una risposta ... –

risposta

1

Stupido non-risposta:

asT :: T -> T 
asT = id 

h = g . asT . f 

mancanza di "inadempiente" è uno dei dolori di sapore di Haskell dei farmaci generici. Le cose diventano troppo generiche e Haskell non sa quale istanza scegliere. Lo status quo è che "il programmatore deve risolvere esplicitamente l'ambiguità". Anziché specificare le regole di primo livello per l'impostazione predefinita, è sufficiente selezionare l'istanza appropriata caso per caso. Num predefinito è un'eccezione hacky a questa regola.

La proposta collegata ha un buon esempio del motivo per cui la scelta dei valori predefiniti non è banale quando sono coinvolte più classi.

default A (Int, String,()) 
default B (String, Int,()) 
(A t, B t) => t -- defaults to what?