我想定义一个Torus表示在边界处环绕的2D数组的类.例如,访问索引超出相应维度大小的数组应返回位置处的元素i mod arraysize.因此,我的类只需要定义一个get方法:
class Torus a where
get :: a -> Int -> Int -> b
Run Code Online (Sandbox Code Playgroud)
这个定义是不精确的.a应该是一个2D数组,b应该是数组中包含的类型.我怎么表达这个?
谢谢,
我想你只是在寻找班上的类型:
class Torus t where
get :: t a -> Int -> Int -> a
Run Code Online (Sandbox Code Playgroud)
或者您是否寻找合适的实例?
您还可以使用函数依赖项或类型系列,以防您想要比简单t :: * -> *类型更复杂的东西:
{-# LANGUAGE MultiParamTypeClasses, FunctionalDependencies #-}
class Torus t v | t -> v where
get :: t -> Int -> Int -> v
instance Torus (Vector a) a where
get = ...
Run Code Online (Sandbox Code Playgroud)
要么
{-# 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 = ...
Run Code Online (Sandbox Code Playgroud)
这需要一些GHC扩展.