我有这个:
data Vector3 t = Vector3 { ax, ay, az :: t }
data Point3 t = Point3 { x, y, z :: t }
data Ray3 t = Ray3 { ori :: Point3 t, dir :: Vector3 t }
data Sphere t = Sphere { center :: Point3 t, radius :: t }
我想要一个Shape类型,所以我这样做了:
class Shape s where
distance :: s -> Ray3 t -> t
distance
获取形状和光线,并计算沿给定光线到形状的距离。当我尝试创建一个实例时,它不起作用。这就是我到目前为止所做的:
instance Shape (Sphere t) where
distance (Sphere center radius) ray = -- some value of type t --
如何创建Shape实例?我已经尝试了所有我能想到的东西,而且我遇到了各种各样的错误。
答案 0 :(得分:9)
问题是t
中的类型变量Sphere t
与distance
的类型签名中的类型变量Sphere t1
不同。您当前的类型是说如果我有Ray3 t2
,我可以针对Shape
进行检查。但是,您可能希望这些类型相同。要解决此问题,我会将class Shape s where
distance :: s t -> Ray3 t -> t
类更改为
t
现在对instance Shape Sphere where
distance (Sphere center radius) ray = ...
的依赖是显式的,所以如果你把你的实例写成
t
类型应该很好地排列,尽管你可能需要在{{1}}上添加一些数字约束来进行任何有用的计算。