我在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)]]
答案 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;类型的功能。像素”。