Переменная неоднозначного типа 'blah' в ограничении… как исправить?

Я пытаюсь написать простой трассировщик лучей на 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'

(Фактический код более сложный, но я пробовал чтобы преобразовать это в нечто более простое, сохранив при этом суть того, чего я пытаюсь достичь)

Как мне это исправить? Или, в качестве альтернативы, учитывая, что я исхожу из стандартного опыта объектно-ориентированного проектирования, что я в корне делаю неправильно?

6
задан stusmith 15 February 2011 в 14:24
поделиться