2011-12-16 10 views
9

Edycja: oto naprawdę prosty przykład. Motywacja do tego przykładu poniżej.dodanie sygnatury typu wywnioskowanego ghci powoduje błąd

To kompiluje:

{-# LANGUAGE TypeFamilies #-} 

type family F a b 

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

f' [a] = f a 

I ghci informuje, że:

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

Ale jeśli dodamy do tego podpisu wpisz do pliku powyżej, narzeka:

*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. 

Co daje ?


Motywacja:

Po obejrzeniu this question, pomyślałem, że być smart-Alec i napisać trochę rozwiązanie żart. Plan ataku powinien zaczynać się od liczb na poziomie typu (jak zwykle), a następnie napisać niewielką funkcję poziomu Args n a c, która daje typ funkcji, który przyjmuje n kopii a i daje c. Następnie możemy napisać małą klasę typów dla różnych n i być na naszej drodze. Oto co Chcę napisać:

{-# 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)) 

Byłem zaskoczony, aby dowiedzieć się, że to nie typ sprawdzić!

+0

To z pewnością więcej wysiłku, niż poświęciłem na uproszczenie tego przykładu! Jakiej wersji GHC używasz, zanim spróbuję za bardzo w to zagłębić? – ehird

+0

@ehird Sprawdziłem z ghc-7.2.2 i ghc-7.3.20111114. –

+0

(Moje podejrzenie, FWIW, jest to, że jest to błąd w GHC, ale myślę, że '' Uwaga: 'Args 'jest funkcją typu, i może nie być wstrzykiwaczem' 'może również mieć znaczenie, błąd może po prostu być w w jaki sposób ': t' wyświetla nazwy lub tym podobne, a nie w samym sprawdzaczu liter). – ehird

Odpowiedz

9

Jest to błąd GHC, jak można wykazać za pomocą następujących, jeszcze bardziej uproszczony przykład:

type family F a 

f :: b -> F a 
f = undefined 

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

Proponuję zgłoszenie go do GHC HQ.

+0

Ładna wskazówka. Jeszcze ci zrobię lepiej: "wpisz rodzinę F a; x, y :: F a; x = niezdefiniowany; y = x'. –

+0

Ha! Udało ci się to 29 sekund przed edycją w jeszcze prostszym przykładzie z IRC niż mój poprzedni. Cóż, przynajmniej możemy być pewni, że to błąd ... – ehird

+1

Zaakceptowanie tej odpowiedzi; aby dać szybką aktualizację, ten "błąd" (?) został rozwiązany w GHC, czyniąc wersję bez adnotacji typu stop, kompilując. =) –

Powiązane problemy