Ответ 1
Унифицировать f
= (a ->)
в типе подписей:
fmap :: (b -> c) -> (a -> b) -> (a -> c)
pure :: b -> (a -> b)
(<*>) :: (a -> b -> c) -> (a -> b) -> (a -> c)
Единственная причина, по которой объявления синтаксически различны, ((->) a)
vs (a ->)
, заключается в том, что вам не разрешено принимать разделы на уровне типа. Таким образом, вы в конечном итоге с ними, после чеканки типов:
instance Functor ((->) a) where
fmap = (.)
instance Applicative ((->) a) where
pure = const
f <*> g = \x -> f x $ g x
Я уверен, что экземпляр Functor
находится в Data.Functor
, а экземпляр Applicative
находится в Control.Applicative
. Экземпляр Monad
для ((->) a)
является единственным в странном месте в Control.Monad.Instances
вместо Control.Monad
. По крайней мере, если я правильно помню.