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
答案 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