сообщение об ошибке при реализации монады `((->) r)` (несоответствие типов) - PullRequest
0 голосов
/ 23 марта 2019

Я только начинаю изучать 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 считает иначе.Какая разница?

1 Ответ

3 голосов
/ 23 марта 2019

Мое фатальное недоразумение заключалось в том, что я думал, что сообщение об ошибке означает, что моя реализация имеет неверную сигнатуру типа.(Я думал, что так как в сигнатуре типа forall.) Оказывается, это не фактическая ошибка, и моя ошибка в реализации заключалась в том, что мне нужно было применить другой термин r к обоим f и m в моей реализации.Спасибо @luqui и @melpomene за указание на это

...