在haskell代码中,星星是什么意思?

在haskell代码中,星星是什么意思?,haskell,Haskell,我在unm hip包中找到了这段代码。 那么像素是一个函数 class Imageable i where type Pixel i :: * rows :: i -> Int cols :: i -> Int ref :: i -> Int -> Int -> (Pixel i) makeImage :: Int -> Int -> PixelOp (Pixel i) -> i pixelList :: i ->

我在unm hip包中找到了这段代码。 那么像素是一个函数

class Imageable i where
  type Pixel i :: *
  rows :: i -> Int
  cols :: i -> Int
  ref  :: i -> Int -> Int -> (Pixel i)
  makeImage :: Int -> Int -> PixelOp (Pixel i) -> i
  pixelList :: i -> [Pixel i]
  pixelList i = [ ref i r c | r <- [0..(rows i - 1)], c <- [0..(cols i - 1)]]
可成像i类,其中
输入像素i::*
行::i->Int
cols::i->Int
参考::i->Int->Int->(像素i)
makeImage::Int->Int->PixelOp(像素i)->i
像素列表::i->[像素i]

pixelList i=[ref i r c | r作为标准Haskell的扩展,您可以处理“种类”.Kinds是类型和类型构造函数的一种非常基本的类型系统。Kind
*
是一种简单的类型,如
Int
。Kind
*->*
是一种类型构造函数,它接受一个类型并生成一个类型,如
Maybe
:将
Int
之类的类型作为参数传递给它,然后得到类型
Maybe Int

此代码中使用的另一个扩展(由于缩进丢失,我一开始没有注意到)是关联类型。标准Haskell中的typeclass可以指定该类型必须支持的许多函数。通过关联类型,它还可以指定与该类型关联的类型和类型构造函数

这里,这意味着作为可成像
实例的类型i(即行为类似于图像)必须具有关联的像素类型像素i,并且该类型必须是简单类型(种类*),而不是类型构造函数。

“那么像素是函数?”


Pixel是一个类型级别的函数。它接受单个类型(必须是Imageable的实例)并返回一种类型“*”。根据它在示例代码中的用法,输入类型也必须是“*”。因此,Pixel非常像,它们都是“*->*”类型的“类型构造函数”,您为它们提供了一个“简单类型”它们返回一个“简单类型”。它们在相同的位置也有效。就像你不能有'Foo->Maybe'类型的函数一样,你也不能有'Bar->Pixel'类型的函数。

没有太多选择。你有某种类型的图像表示,而typeclass需要处理图像中单个像素的函数。你需要某种方法找出该像素的类型。你可以修复它,但这不是很灵活。你可以在图像及其像素上创建一个多参数类型类Imageable,但你需要函数依赖关系或类型歧义会让你发疯,你仍然需要在使用该类的每个签名中提到像素类型。Associated类型更干净、更简单。因此
类型
关键字与haskell类型同义词关键字不同,对吗?如果是如您所说的,为什么不这样写:
类型像素::i->*
@osager它是相关的,但不是相同的。当您提供(可映像的my_图像)时例如,您对Pixel的定义必须是现有类型,并且(Pixel my_image)将是该类型的别名/同义词。它是一个名为(open)type families的GHC扩展。