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

时间:2014-04-02 09:53:56

标签: 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)]]

2 个答案:

答案 0 :(得分:15)

作为标准Haskell的扩展,您可以处理&#34;种类&#34;。对于类型和类型构造函数,种类是一种非常基本的类型系统。善意*是一种简单类型,例如Int。 Kind * -> *是一个类型构造函数,它接受一个类型并生成一个类型,如Maybe:传递类似Int的类型作为参数,然后得到类型Maybe Int

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

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

答案 1 :(得分:1)

“所以Pixel是一个功能?”

Pixel是一种类型级功能。它需要一个类型(必须是Imageable的一个实例)并返回一种类型'*'。根据它在示例代码中的用法,输入类型也必须是'*'。因此,Pixel非常像Maybe,它们都是'* - &gt;类型的“类型构造函数”。 *',你为他们提供了一个“简单类型”,他们返回一个“简单类型”。它们也在同一地点有效。就像你不能拥有'Foo - &gt;类型的功能一样也许',你也将无法拥有'Bar - &gt;类型的功能。像素”。