Высший сорт типа на typeclass? [Дубликат]

Попробуйте установить без кеширования: pip install --no-cache-dir tensorflow.

8
задан Sibi 11 July 2015 в 00:11
поделиться

2 ответа

В отличие от Maybe, Monad не является типом ; это typeclass .

То же самое касается других типов:

Num :: * -> Constraint
Functor :: (* -> *) -> Constraint
Bifunctor :: (* -> * -> *) -> Constraint

Где * представляет конкретные типы (например, Bool или Int), -> представляют типы более высокого типа (такие как Maybe), а Constraint представляет идею ограничения типа. Вот почему:


Как известно, мы не можем сделать такую ​​подпись:

return :: a -> Monad a -- This is nonsense!

Поскольку Monad следует использовать как ограничение , чтобы сказать, что «это должна быть монада для работы»:

return :: (Monad m) => a -> m a

Мы делаем это, потому что знаем, что return не может работать ни с одним старым типом m , поэтому мы определяем поведение return для разных типов под именем Monad. Другими словами, нет ни одной вещи, которую можно назвать Монадой, а только поведения, которое можно назвать монадическим.

По этой причине мы создали это ограничение типа, говоря, что мы должны были предварительно определить что-то в качестве Монады, чтобы использовать эту функцию. Вот почему Monad является (* -> *) -> Constraint - он сам по себе не является типом!


Maybe является экземпляром Monad. Это означает, что где-то кто-то написал:

instance Monad Maybe where
  (>>=) = ... -- etc

... и определил, как Maybe должен вести себя как Монада. Вот почему мы можем использовать Maybe с функциями или типами, которые имеют ограничение префикса Monad m => .... Это по существу, где определяется ограничение, примененное Monad.

11
ответ дан AJFarmar 22 August 2018 в 10:30
поделиться

Constraint является видом, например. Show Int, Monad Maybe и Monoid [a]. Грубо говоря, это то, что может происходить в левой части => в аннотациях типа.

Теперь, поскольку

Show Int :: Constraint

и Int - тип, т.е.

Int :: *

, мы можем присвоить функциональный вид Show следующим образом

Show :: * -> Constraint
             ^-- the result kind
        ^-- the kind of Int

. В вашем случае просто происходит, что Monad принимает аргумент, подобный Maybe , поэтому

Maybe Int :: *
Maybe :: * -> *
Monad :: (* -> *) -> Constraint
                     ^-- the result kind
         ^-- the kind of Maybe
8
ответ дан chi 22 August 2018 в 10:30
поделиться
Другие вопросы по тегам:

Похожие вопросы: