Sorumluluk reddi: Bu yanıt esasen tahmin çalışmasıdır, çünkü bu davranış gerçekten beni şaşırttı ve ben hala tam olarak typechecker içinde Any
semantiklerinden çok emin değilim. o belirsiz bir tip değişken bulur ve Any
bunu somutlaştırır Nope a
tipi hesaplar zaman Yeah
muhtemelen reddedilmesi gerektiğini göz ardı senin örnekte
. Bu, örn. length []
çalışması.
Sen ghc 7.10 kabul edilen bir GADT, Aynı işlemleri :, eşitlik '() ~ Any
data Yeah (a ::()) b c where
Yeah :: b -> Yeah '() b c
Nope :: c -> Yeah Any b c
ikinci durumda bir işlev
yeah :: Yeah '() b c -> b
yeah (Yeah a) = a
yeah (Nope _) = error "???"
ihtiyaç uc
yazmak için ise verdiğim gibi, örneğin
okay :: 'True :~: 'False -> x
-- okay Refl = error "???" -- Compiler rejects this case
okay x = case x of
ama bu bir: 'True ~ 'False
, Int ~ Bool
vb typechecker bu gerçekleri bilir!
really :: Any :~: '() -> x
really Refl = error "???" -- Perfectly valid pattern match
Aslında bu işlevi çağırmak olamaz:
>:t really Refl
<interactive>:1:8: Warning:
Couldn't match type `Any' with '()
Expected type: Any :~: '()
Actual type: '() :~: '()
In the first argument of `really', namely `Refl'
In the expression: really Refl
ve süre uc
typechecks (tanım değişmedi) artık kırar:
>uc 'a' :: Int
*** Exception: ???
O typechecker yapar gibi görünüyor '() :~: Any
'un iskan edilmediğine inanmayın, çünkü bu, çünkü typechecker dahili olarak böyle bir kanıt üretmesine izin verilir, ancak kullanıcı hala sağa sola Kendileri yazıyor.
Tüm söylemek gerekirse: Bence Any
varsa, unitsEqual
sesli ve Any
varoluşundan kaynaklanır.Any :~: '()
- - kar¸ıt tarafından açıkça yanlış olduğu görünüyor ama x ~ y
x
ve y
farklı türleri vardır ve ne x
veya y
Any
yalnızca trivially yanlış olduğunu söylüyor Any
için özel typechecker kural var gibi görünüyor.
voidEqual
eşit çürük olduğu için Any :: Void
, Any Any :: Void
, Any Any Any :: Void
vb
Bu ghc 7.10.3 tarihinde Yeah' 'için "Çakışan aile örneği bildirimleri" verir. – user2407038
@ user2407038, ilginç! 7.8.3'ün altında test ettim. 7.10.3'te çalışmam için bunu düzeltip değiştiremeyeceğimi görmeliyim. – dfeuer