значение объявления "type" в объявлении класса типов - PullRequest
0 голосов
/ 12 сентября 2018

Я только что упал на этот кусок кода:

-- | Gathers common slice operations.
class Slice a where
    type Loc a

    sliceEvents :: a -> [ResolvedEvent]
    -- ^ Gets slice's 'ResolvedEvent's.
    sliceDirection :: a -> ReadDirection
    -- ^ Gets slice's reading direction.
    sliceEOS :: a -> Bool
    -- ^ If the slice reaches the end of the stream.
    sliceFrom :: a -> Loc a
    -- ^ Gets the starting location of this slice.
    sliceNext :: a -> Loc a
    -- ^ Gets the next location of this slice.
    toSlice :: a -> SomeSlice
    -- ^ Returns a common view of a slice.

Я не понимаю, что делает type Loc a ...

1 Ответ

0 голосов
/ 12 сентября 2018

Loc a - это связанный тип, который является способом объявления экземпляра семейства типов, связанного с экземпляром класса.Тип, представленный Loc a, определяется типом a и указывается в экземпляре: например,

instance Slice Foo where
    type Loc Foo = Bar
    ...

Везде, где в объявлении класса присутствует Loc a, оно будет заменено насоответствующий тип в экземпляре - поэтому функции экземпляра для Foo будут выглядеть как

sliceEvents :: Foo -> [ResolvedEvent]
...
sliceFrom :: Foo -> Bar
...

Связанный тип также можно использовать в других функциях вне объявления класса, задав ограничение класса: например,

myFunction :: (Slice a) => a -> Loc a
...