Haskell 定义环面类
我想定义一个Haskell 定义环面类,haskell,Haskell,我想定义一个Torus类,它表示在边界处环绕的二维数组。例如,访问索引超出相应维度大小的数组时,应返回位于i mod arraysize位置的元素。因此,我的类应该只需要定义一个get方法: class Torus a where get :: a -> Int -> Int -> b 这个定义不精确a应该是2D数组,b应该是数组中包含的类型。我如何表达这一点 谢谢,我想你只是在课堂上寻找类型: class Torus t where get :: t a -
Torus
类,它表示在边界处环绕的二维数组。例如,访问索引超出相应维度大小的数组时,应返回位于i mod arraysize
位置的元素。因此,我的类应该只需要定义一个get
方法:
class Torus a where
get :: a -> Int -> Int -> b
这个定义不精确a
应该是2D数组,b
应该是数组中包含的类型。我如何表达这一点
谢谢,我想你只是在课堂上寻找类型:
class Torus t where
get :: t a -> Int -> Int -> a
或者您是否在寻找合适的实例?如果您想拥有比简单的
t::*->*
type:
{-# LANGUAGE MultiParamTypeClasses, FunctionalDependencies #-}
class Torus t v | t -> v where
get :: t -> Int -> Int -> v
instance Torus (Vector a) a where
get = ...
或
但这需要一些GHC扩展。这不就是循环列表的循环列表吗?@Sarah但以这种方式实现它会使程序比使用向量(例如)时慢。你来自OO背景吗?这看起来不像是typeclass的工作;更像是一种抽象的数据类型。只是好奇:在什么情况下需要这种类型?通常情况下,案例集合类型可能比
*->*
-类类型更复杂。例如,类型为Int->Int->a
的函数也可以被视为2d矩阵,如果没有FDs/TFs,则无法使其成为所需类型类的合理实例。您可以在FDs的背景下阅读GHC文档:。关联类型执行相同的任务,因此这也适用于它们。
{-# 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 = ...