определение Bind
класса в прелюдии является:переплета экземпляр класса для частично применяемых функций
class Apply m <= Bind m where
bind :: forall a b. m a -> (a -> m b) -> m b
Это может быть прочитан как функция принимает два входных параметров, значение в монадическое контексте (m a
) и функцию (a -> m b
) и возврат значения в монадическом контексте (m b
).
Экземпляр Bind
для частично прикладной функции определяется следующим образом:
instance bindFn :: Bind ((->) r) where
bind m f x = f (m x) x
который является функцией, принимая три параметров. Как это выглядит?
Если я пытаюсь заменить m a
на более конкретного типа я получаю (поправьте меня, если я ошибаюсь):
(((->) ??) a) -> (a -> (((->) ??) b)) -> (((->) ??) b)
что эквивалентно
(?? -> a) -> (a -> (?? -> b)) -> (?? -> b)
Предполагая, что переменная m
является оценка до (?? -> a
), f
будет привязан к a -> ?? -> b
и x
ко второму ??
.
Является ли мое рассуждение правильным?