Haskell: объявление экземпляра Bizzare в привязках SDL - PullRequest
1 голос
/ 04 февраля 2011

Привязки 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?

Исходный код из хакера здесь: http://hackage.haskell.org/packages/archive/SDL/0.6.2/doc/html/src/Graphics-UI-SDL-Keysym.html#SDLKey

1 Ответ

5 голосов
/ 04 февраля 2011

Это не экземпляр Enum из Prelude (см. import Prelude hiding (Enum(..)) в верхней части файла).

Это экземпляр Enum из 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
...