pure
функция возвращает значение полиморфного:
Prelude> :t pure "foo"
pure "foo" :: Applicative f => f [Char]
Для Maybe
, pure
просто определяется как Just
:
instance Applicative Maybe where
pure = Just
-- ...
Другие типы предоставляют различные определения; В качестве примера, он определен для списков, как
instance Applicative [] where
pure x = [x]
-- ...
Задания типа для возвращаемого значения говорит Haskell, который Applicative
экземпляра, используемый для определения pure
.
Prelude> pure "foo" :: [[Char]]
["foo"]
Prelude> pure "foo" :: Maybe [Char]
Just "foo"
В дополнение к предоставлению явного типа, Haskell может вывести, какой тип использовать базу, как используется значение. Например, (<*> [1..5]) :: (Num a, Enum a) => [a -> b] -> [b]
, поэтому в pure (+3) <*> [1..5]
мы знаем, что pure (+3)
должен иметь тип [a -> b]
. Аналогично, в pure (+3) <*> Just 5
мы знаем, что pure (+3)
должен иметь тип Maybe (a->b)
.
В общем, в любом выражении pure f <*> g
, тип g
определит, для какого типа значения необходимо вернуть pure f
.