2011-12-16 12 views
9

Modifica: Ecco un esempio davvero semplice. Motivazione per questo esempio qui sotto.aggiungendo la firma del tipo inferito di ghci causa un errore

Questo compila:

{-# LANGUAGE TypeFamilies #-} 

type family F a b 

f :: a -> F a b 
f = undefined 

f' [a] = f a 

E ghci riporta che:

*Main> :t f' 
f' :: [a] -> F a b 

Ma se aggiungiamo questa firma tipo per il file di cui sopra, si lamenta:

*Main> :r 
[1 of 1] Compiling Main    (test.hs, interpreted) 

test.hs:9:14: 
    Couldn't match type `F a b0' with `F a b' 
    NB: `F' is a type function, and may not be injective 
    In the return type of a call of `f' 
    In the expression: f a 
    In an equation for `f'': f' [a] = f a 
Failed, modules loaded: none. 

ciò che dà ?


Motivazione:

Dopo aver visto this question, ho pensato che sarei una smart-alec e scrivere un po 'di soluzione di battuta. Il piano di attacco è quello di iniziare con i numeri a livello di codice (come al solito), quindi scrivere una piccola funzione a livello di tipo Args n a c che restituisce il tipo di funzione che prende n copie di a e produce uno c. Quindi possiamo scrivere un po 'di classe per i vari n ed essere sulla buona strada. Ecco quello che voglio a scrivere:

{-# LANGUAGE TypeFamilies #-} 

data Z = Z 
data S a = S a 

type family Args n a c 
type instance Args Z a c = c 
type instance Args (S n) a c = a -> Args n a c 

class OnAll n where 
    onAll :: n -> (b -> a) -> Args n a c -> Args n b c 

instance OnAll Z where 
    onAll Z f c = c 

instance OnAll n => OnAll (S n) where 
    onAll (S n) f g b = onAll n f (g (f b)) 

Sono stato sorpreso di scoprire che questo non digitare-check!

+0

Questo è sicuramente uno sforzo maggiore di quello che ho dedicato a semplificare quell'esempio! Che versione di GHC stai usando, prima che provi a scavare troppo profondamente in questo? – ehird

+0

@ehird Ho controllato con ghc-7.2.2 e ghc-7.3.20111114. –

+0

(Il mio sospetto, FWIW, è che si tratta di un bug in GHC, tuttavia, penso che '' NB: 'Args 'è una funzione di tipo, e potrebbe non essere injective'' potrebbe essere rilevante, il bug potrebbe essere semplicemente in come ': t' mostra nomi o simili, piuttosto che nel correttore di testo stesso.) – ehird

risposta

9

Questo è un bug GHC, come può essere dimostrato dal seguente, ulteriormente semplificata esempio:

type family F a 

f :: b -> F a 
f = undefined 

f' :: b -> F a 
f' a = f a 

Suggerisco segnalarlo alla GHC HQ.

+0

Un buon consiglio. Ti farò ancora meglio: 'digita la famiglia F a; x, y :: F a; x = indefinito; y = x'. –

+0

Ha! Hai gestito quel 29 secondi prima di modificare un esempio ancora più semplice da IRC rispetto al mio precedente. Bene, almeno possiamo essere sicuri che sia un bug adesso ... – ehird

+1

Accettare questa risposta; per dare un rapido aggiornamento, questo "bug" (?) è stato risolto in GHC rendendo la compilazione della versione senza annotazione di tipo. =) –

Problemi correlati