Я только начинаю изучать haskell, и я пытаюсь реализовать некоторые обычные монады в качестве упражнений для себя.Поскольку я возился с монадой ((->) r)
, я реализовал это (неправильное) определение:
instance Monad ((->) r) where
return x = \_ -> x
m >>= f = \c -> (f . m) c
GHCi пожаловался мне с помощью
• Couldn't match expected type ‘b’ with actual type ‘t -> b’
`b’ is a rigid type variable bound by
the type signature for:
(>>=) :: forall a b. (t -> a) -> (a -> t -> b) -> t -> b
, тогда как тип должен быть:
(>>=) :: (t -> a ) -> (a -> t -> b) -> t -> b
Почему моя реализация ломает его?И, похоже, версия forall
должна давать точно такой же тип, но GHCi считает иначе.Какая разница?