Я играю с Control.Applicative
, и я понимаю, что не понимаю всего с системой типа Haskell.Понимание системы типа 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', тогда выражение будет иметь этот тип. –
Кроме того, константа является литералом и поэтому имеет тип '2 :: Num a => a'. – Zeta
try next: ': t (<*>) (pure (2 :: Int))' – viorior