Haskell:SDL绑定中的Bizzare实例声明

时间:2011-02-04 07:57:08

标签: haskell sdl

Haskell SDL绑定导出名为SDLKey的枚举类型。但是Enum实例以一种奇怪的方式声明:

instance Enum SDLKey Word32 where
    fromEnum SDLK_UNKNOWN = 0
    fromEnum SDLK_FIRST = 0
    fromEnum SDLK_BACKSPACE = 8
    ...

SDLKey不接受任何类型参数,这怎么不是语法错误? Haskell报告说SDLKey不是Enum的实例,所以定义Enum函数的类型是什么?而且,最重要的是,给定SDLKey,如何在其上调用Enum函数?

来自hackage的源代码:http://hackage.haskell.org/packages/archive/SDL/0.6.2/doc/html/src/Graphics-UI-SDL-Keysym.html#SDLKey

1 个答案:

答案 0 :(得分:5)

它不是Prelude的Enum实例(请参阅文件顶部附近的import Prelude hiding (Enum(..)))。

它是Enum from Graphics.UI.SDL.Utilities的一个实例,它带有第二个参数:

class Enum a b | a -> b where
  succ :: a -> a
  pred :: a -> a
  toEnum :: b -> a
  fromEnum :: a -> b
  enumFromTo :: a -> a -> [a]

与前奏中的定义比较:

class  Enum a   where
    succ                :: a -> a
    pred                :: a -> a
    toEnum              :: Int -> a
    fromEnum            :: a -> Int
    enumFrom            :: a -> [a]
    enumFromThen        :: a -> a -> [a]
    enumFromTo          :: a -> a -> [a]
    enumFromThenTo      :: a -> a -> a -> [a]
    -- comments and default definitions elided