Я играю с Control.Applicative
и понимаю, что не все понимаю в системе типов Haskell.
Вот мой эксперимент в Ghci:
λ :t (<*>)
(<*>) :: Applicative f => f (a -> b) -> f a -> f b
λ :t (<*>) (pure 2)
(<*>) (pure 2) :: (Num (a -> b), Applicative f) => f a -> f b
Тип первого аргумента <*>
- f (a -> b)
.
- Почему это выражение правильное?
- Как ее можно объединить с
(pure 2)
, если константа2
не относится к типуa -> b
? - Что означает
Num (a -> b)
? Как функция, имеющая типa -> b
, может быть экземпляромNum
?
Num (a -> b)
в контексте не означает, что существует экземплярNum
дляa -> b
. Это означает, что если бы был экземплярNum
дляa -> b
, то выражение имело бы этот тип. - person Tom Ellis   schedule 02.12.20142 :: Num a => a
. - person Zeta   schedule 02.12.2014:t (<*>) (pure (2 :: Int))
- person viorior   schedule 02.12.2014