Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/backbone.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Haskell 定义环面类_Haskell - Fatal编程技术网

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 = ...