Ben Haskell basit ışın-izleyici yazmaya çalışıyorum. Bir ışın bunları kesiştiği belirlemek için bir fonksiyonu olan, mevcut yüzeylerin çeşitli temsil eden bir typeclass tanımlamak istediği:Kısıtlayıcı tipte değişken 'blah' kısıtlaması ... nasıl düzeltilir?
Ambiguous type variable 's' in the constraint:
'Surface'
arising from a use of 'surface'
(gerçek:
{-# LANGUAGE RankNTypes #-}
data Vector = Vector Double Double Double
data Ray = Ray Vector Vector
class Surface s where
intersections :: s -> Ray -> [Vector]
-- Obviously there would be some concrete surface implementations here...
data Renderable = Renderable
{ surface :: (Surface s) => s
, otherStuff :: Int
}
getRenderableIntersections :: Renderable -> Ray -> [Vector]
getRenderableIntersections re ra = intersections (surface re) ra
Bununla birlikte, bu bana hata verir Kod daha karmaşıktır ama elde etmeye çalıştığım şeyi korurken, daha basit bir şeye damlatmaya çalıştım).
Bunu nasıl düzeltebilirim? Ya da alternatif olarak, standart bir OO arka planından geldiğim için, temel olarak neyi yanlış yapıyorum? senin getRenderableIntersections
fonksiyonda
ama tüm yüzeyler 'kesişme' yöntemini uyguladığı için, neden bu yeterli değil? Açıkçası arka planım ile 'Surface'i soyut bir sınıf olarak görüyorum ve sanal bir yöntem olarak' kavşakları 'görüyorum. – stusmith
@stusmith: Güncellemeye bakın. İfadelerin ortasında açık tip parametreleri olamaz. Tüm ifadenin parametrik olması ya da türlerin tümü statik olarak belirlenebilir. (Belki bir GHC uzantısı ya da buna izin veren bir şey var, ama ben bunu bilmiyorum) –
Bu, Haskell'in 'sanal' işlevlere eşdeğer olmadığı anlamına mı geliyor? Renderables'ın bir listesini yapmak ve soyut tipler üzerinde çalışabilmek istedim. Bu nedenle, bunun yerine [Yenilenebilir s] 'ye ihtiyacım var mı? Ve bu liste farklı "Yüzey" örnekleriyle heterojen "Değiştirilebilir" örnekleri içerebilir mi? – stusmith