这个明星代码中的明星是什么意思?

McB*_*den 12 haskell

我在unm-hip包中找到了这段代码.那么Pixel是一个功能?

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)]]
Run Code Online (Sandbox Code Playgroud)

Seb*_*edl 15

作为标准Haskell的扩展,您可以处理"种类".对于类型和类型构造函数,种类是一种非常基本的类型系统.种类*很简单,就像Int.Kind * -> *是一个类型构造函数,它接受一个类型并产生一个类型,例如Maybe:传递类似Int参数的类型,然后获得类型Maybe Int.

此代码中使用的另一个扩展(我最初没有注意到,因为缩进丢失)是相关类型.标准Haskell中的类型类可以指定类型必须支持的许多函数.对于关联类型,它还可以指定与类型关联的类型和类型构造函数.

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

  • 没有太多选择.你有某种代表图像的类型,类型类需要处理图像中单个像素的函数.你需要一些方法来找出那个像素的类型.你可以解决它,但这不是很灵活.你可以在图像及其像素上使Imageable成为一个多参数类型类,但是你需要功能依赖或类型歧义会让你发疯,你还需要在每个使用该类的签名中提到像素类型.相关类型更清晰,更容易. (2认同)