düzeltir.bu kodu düşünün bir tür hatasının
Foo.hs:16:17:
Could not deduce (Foo a) arising from a use of ‘bar’
from the context (SomeClass a)
bound by the type signature for foo :: SomeClass a => a -> Int
at Foo.hs:15:8-32
Possible fix:
add (Foo a) to the context of
the inferred type of x :: Int
or the type signature for foo :: SomeClass a => a -> Int
In the expression: bar t
In an equation for ‘x’: x = bar t
In the expression: let x = bar t in x
Bunu düzeltmek için iki yol vardır: Bunun yerine, GHC o kadar Foo a => SomeClass a
örneğini kullanarak yapmanız gerekir varsayar foo
yılında
- ,
bar t
- için
let x = bar t in x
değişen çizgisiniinstance SomeClass Int
ekleme benim program
Burada neler oluyor? Bu sorun neden ortaya çıkıyor ve bu düzeltmeler neden çalışıyor?
Bu örnek, elbette, asıl sorunum tarafından basitleştirilmiştir. Çok dilli dönüşüm için Cubix çerçevesindeki çalışma sırasında karşılaştım (arxiv.org/pdf/1707.04600).
Asıl sorunum, InjF f IdentL FunctionExpL
kısıtlamasına sahip bir işlevi içerir ("f, işlev çağrısında işlevi belirtmek için tanımlayıcıların kullanılabileceği bir dildir"). Ben bir (Could not deduce FunctionIdent :<: f
hatası) bana yanlış veren bir (overlappable) örneği (FunctionIdent :<: f) => InjF f IdentL FunctionExpL
var.
orada belirli Foo
için kapsamındaki bir örnek InjF Foo IdentL FunctionExpL
, yani bu diğer örneği sorunu çözmek gerektiğini öngörür leftaroundabout cevabı, tam hikaye olmasa bile bu sorun devam.
'{- # OVERLAPPABLE # -}' ve '{- # LANGUAGE FlexibleContexts # -}' hiçbir şeyi etkilemez. Derlemenin başka bir yolu: 'let' bağlanmasına bir' x :: Int 'ekleyin. – Alec
Belki de en iğrenç şey, modülde allo'da bir _no örneği olduğunda da yazım denetimi yapmasıdır ... – leftaroundabout