2

我想定义一个Torus表示在边界处环绕的二维数组的类。例如,使用超出相应维度大小的索引访问数组应返回 position 处的元素i mod arraysize。因此,我的类应该只需要这样定义一个get方法:

class Torus a where
    get :: a -> Int -> Int -> b

这个定义是不精确的。a应该是一个二维数组,并且b应该是数组中包含的类型。我该如何表达?

谢谢,

4

2 回答 2

8

我想你只是在寻找类中的类型:

class Torus t where
    get :: t a -> Int -> Int -> a

或者您是否在寻找合适的实例?

于 2012-05-29T09:06:19.163 回答
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 扩展。

于 2012-05-29T09:30:12.870 回答