2016-02-09 15 views
5

Supponiamo che l'applicazione della funzione di Haskell (l'operatore "spazio") fosse in una classe di caratteri anziché nella lingua. Immagino che sarebbe simile aCosa accadrebbe se l'applicazione di funzione fosse un typeclass?

class Apply f where 
    ($) :: f a r -> a -> r 

instance Apply (->) where 
    ($) = builtinFnApply# 

E f a sarebbe desugar a f $ a. L'idea è che questo ti consente di definire altri tipi che agiscono come funzioni, ovvero

instance Apply LinearMap where 
    ($) = matrixVectorMult 

e così via.

Questo rende indecidibile il tipo di deduzione? Il mio istinto dice che lo fa, ma la mia comprensione dell'inferenza di tipo si ferma al semplice Hindley-Milner. Come seguito, se il numero è indecidibile, , può essere reso decidibile mettendo fuori legge alcune istanze patologiche?

risposta

5

Se si può immaginare questo come uno zucchero sintattico sopra Haskell (sostituendo lo "operatore di spazio" con il proprio), non riesco a capire perché questo dovrebbe rendere l'inferenza di tipo peggiore di quanto non sia già.

Posso tuttavia vedere che il codice potrebbe essere più ambiguo con questa modifica, ad es.

class C a where get :: a 
instance C (Int -> Int) where get = id 
instance C Linearmap where get = ... 

test = get (5 :: Int) -- actually being (get $ (5 :: Int)) 

Sopra get potrebbero essere raccolti da entrambe le istanze, mentre tale ambiguità non si pone nel normale Haskell.