Şartları serbest değişkenleri tarafından endekslenen bir türlenmemiş lambda hesabı. Tür düzeyinde dizeleri tekil değerler için singletons
kitaplığı kullanıyorum. Var
, bir serbest değişken sunar. Bir lambda soyutlaması, vücutta serbest olan bir değişkeni (eşleşen bir tane varsa) bağlar. Uygulamalar ifadenin iki bölümünün serbest değişkenlerini birleştirerek, kopyaları kaldırarak (x y
serbest değişkenleri x
ve y
, x x
serbest değişkenleri ise yalnızca x
). Ben interaktif isteminde bu testGHC neden tip ailemi azaltmıyor?
type family Remove x xs where
Remove x '[] = '[]
Remove x (x ': xs) = Remove x xs
Remove x (y ': xs) = y ': Remove x xs
type family Union xs ys where
Union xs ys = Nub (xs :++ ys)
type family xs :++ ys where
'[] :++ ys = ys
(x ': xs) :++ ys = x ': (xs :++ ys)
type family Nub xs where
Nub xs = Nub' '[] xs
type family Nub' seen xs where
Nub' seen '[] = '[]
Nub' seen (x ': xs) = If (Elem x seen) (Nub' seen xs) (Nub' (x ': seen) (x ': xs))
type family If c t f where
If True t f = t
If False t f = f
type family Elem x xs where
Elem x '[] = False
Elem x (x ': xs) = True
Elem x (y ': xs) = Elem x xs
:
ghci> :t Var (sing :: Sing "x")
Var (sing :: Sing "x") :: Expr '["x"] -- good
ghci> :t (Lam (sing :: Sing "x") (Var (sing :: Sing "x")))
(Lam (sing :: Sing "x") (Var (sing :: Sing "x")))
:: Expr (Remove "x" '["x"]) -- not so good
Ben kimlik işlevi \x. x
tipi Expr (Remove "x" '["x"])
değil Expr '[]
olduğunu öğrenmek için sürpriz oldu O tip aileleri yazdım. GHC, Remove
aile tipini değerlendirmek istemiyor gibi görünüyor. Ben biraz daha tecrübe ve se başına benim tipim ailesi ile ilgili bir sorun olmadığını öğrendik - GHC bu durumda bunu azaltmak için mutludur:
ghci> :t (Proxy :: Proxy (Remove "x" '["x"]))
(Proxy :: Proxy (Remove "x" '["x"])) :: Proxy '[]
Yani: Neden olmasın GHC '[]
için Remove "x" '["x"]
azaltacaktır zaman GADT’imin türünü sorgula? Genel olarak, tip denetçisi ne zaman bir tür aile değerlendirirse değerlendirmez? Davranışından şaşmamak için kullanabileceğim buluşsal yöntemler var mı?
“Neden GHC ailemi azaltmaz: singletons kütüphanede orada bağımlılık değildir bu yüzden
Ben tanımları değişti (daha kolay, anlık test etmek)? ”Ve çok acımasız geliyordu. –
@JoachimBreitner En iyi derleyiciler bile, –
olmasını istediğiniz her şeyi yapamazlar. Https://wiki.haskell.org/GHC/Type_families#Closed_family_simplification adresindeki “Remove” öğesindeki örtüşen tanımlardan şüphelenirim. Muhtemelen bir tür kısıtlamaya gereksiniminiz vardır, bu türlerin eşitsiz olduğuna inanıyoruz – phadej