我想定义一个Torus
类来表示在边界处环绕的2D数组。例如,访问索引超出相应维度大小的数组应该返回位置i mod arraysize
的元素。因此,我的班级只需要定义一个get
方法:
class Torus a where
get :: a -> Int -> Int -> b
这个定义是不精确的。 a
应该是一个2D数组,b
应该是数组中包含的类型。我怎么能表达这个呢?
谢谢,
答案 0 :(得分:8)
我想你只是在寻找班上的类型:
class Torus t where
get :: t a -> Int -> Int -> a
或者您是否寻找合适的实例?
答案 1 :(得分:8)
您还可以使用功能依赖项或类型系列,以防您希望拥有比简单t :: * -> *
类型更复杂的内容:
{-# LANGUAGE MultiParamTypeClasses, FunctionalDependencies #-}
class Torus t v | t -> v where
get :: t -> Int -> Int -> v
instance Torus (Vector a) a where
get = ...
或
{-# LANGUAGE TypeFamilies #-}
class Torus t where
type Element t
get :: t -> Int -> Int -> Element t
instance Torus (Vector a) where
type Element (Vector a) = a
get = ...
这需要一些GHC扩展。