значение объявления типа в объявлении класса типов

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

-- | 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...


person Nicolas Henin    schedule 12.09.2018    source источник
comment
Это не стандартный Haskll 2010; это одно из самых экзотических языковых расширений GHC. (Ассоциированные типы, я думаю...)   -  person MathematicalOrchid    schedule 12.09.2018
comment
о да, это имя..... и это расширение... {-# LANGUAGE TypeFamilies #-}   -  person Nicolas Henin    schedule 12.09.2018


Ответы (1)


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
person Isaac van Bakel    schedule 12.09.2018