Я пытаюсь написать простой трассировщик лучей на Haskell. Я хотел определить класс типов, представляющий различные типы доступных поверхностей, с функцией определения, где луч пересекает их:
{-# 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
Однако это дает мне ошибку:
Ambiguous type variable 's' in the constraint:
'Surface'
arising from a use of 'surface'
(Фактический код более сложный, но я пробовал чтобы преобразовать это в нечто более простое, сохранив при этом суть того, чего я пытаюсь достичь)
Как мне это исправить? Или, в качестве альтернативы, учитывая, что я исхожу из стандартного опыта объектно-ориентированного проектирования, что я в корне делаю неправильно?