LINUX.ORG.RU

Преобразование моноида в аппликативный функтор, непонятки с типизацией

 


0

4

Значит так:

Prelude Data.Functor.Constant Control.Applicative> :t (<*>)
(<*>) :: Applicative f => f (a -> b) -> f a -> f b

Старая добрая всем хорошо известная функция

Дальше:

Prelude Data.Functor.Constant Control.Applicative> Constant "Hello " <*> Constant "world!"
Constant "Hello world!"

Всё хорошо, но почему выражение Constant "Hello " <*> Constant "world!" прошло проверку типов, при том, что <*> ждёт первым аргументом f (a -> b) а реально передан Constant "Hello ", т. е. f a?

★★★

Отвечу просто кодом:

Prelude Data.Functor.Constant> :i Constant
type role Constant representational phantom
newtype Constant a b = Constant {getConstant :: a}
        -- Defined in ‘Data.Functor.Constant’

Prelude Data.Functor.Constant> :t Constant "Hello"
Constant "Hello" :: Constant [Char] b

Prelude Data.Functor.Constant> :t Constant "hello" :: Constant String (Int -> Bool)
Constant "hello" :: Constant String (Int -> Bool)
  :: Constant String (Int -> Bool)

Prelude Data.Functor.Constant> (Constant "hello" :: Constant String (Int -> Bool)) <*> (Constant " world" :: Constant String Int)
Constant "hello world"

Спрашивайте ваши ответы, если они остались.

qnikst ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.