Подтвердить что ты не робот

Каково название этого монадоподобного шаблона функционального программирования?

Я иногда сталкивался с шаблоном в коде, который напоминает монаду, но не поддерживает согласованный тип в >>=.

Вот простейший пример, который я мог бы придумать:

(Сначала несколько булевых типов уровня:

data TyT = TyT
data TyF = TyF

class TyOr a b c | a b -> c

instance TyOr TyF TyF TyF
-- rest similarly

)

Теперь вот наш конструктор типа "монада":

data Marked p a = Marked a
    deriving (Show)

Для данного p, Marked p является * -> *, который очень похож на m в монады, но разные, как это происходит дальше, когда мы определяем "bind":

(>>%) :: (TyOr p q r) => Marked p a -> (a -> Marked q b) -> Marked r b
(Marked x) >>% f = Marked y where Marked y = f x

Что здесь отличает то, что результат >>% имеет другой тип конструктор, чем аргументы. Кроме того, это в основном монада.

Мы могли бы использовать его следующим образом:

a :: Marked TyF Int
a = Marked 5

f :: Int -> Marked TyT Int
f x = Marked (x + 1)

ghci> a >>% f
Marked 6

ghci> :t a >>% f
a >>% f :: Marked TyT Int

(Это было вдохновлено наблюдением outis, что Python с" не может быть monad, потому что он меняет тип, но я видел его другими способами (проще) тоже).

4b9b3361

Ответ 1

Ну, он в какой-то мере тесно связан с монадами, просто несовместим с классом типа Monad. В частности, мы можем отметить следующие параллели:

  • Моноиды имеют ассоциативную операцию с идентификатором, определенным на значениях согласованного типа: mappend :: a -> a -> a и mempty :: a.

  • Монады имеют ассоциативную операцию с идентификатором, определенным на конструкторах типа, например: join :: m (m a) -> m a и return :: a -> m a.

  • Функции - действительно, стрелки в категории - имеют ассоциативную операцию и идентичность, но ассоциативная операция индексируется объектами категории, что здесь означает "типы": (.) :: arr b c -> arr a b -> arr a c и id :: arr a a.

... так что же будет монада, чья join индексируется по типам? Hm.

Несколько ссылок, которые вы можете найти интересными, исследуя связанные понятия:


post scriptum - Вы сказали это в комментарии к вопросу:

Ты прав. На самом деле я хочу исправить это, чтобы быть более похожим на монад, хотя, хотя я и не использую "монады". Я отредактирую его. Хотя у меня был бы более или менее тот же вопрос об применениях.

Собственно, ограничение вещей до Applicative существенно меняет ситуацию! Разница между a -> Marked p b и Marked p (a -> b) заключается в том, что в первом свойства структуры Marked p могут зависеть от параметра a; тогда как в последнем маркировка не зависит от аргументов функции. Независимость означает, что эти две стороны могут рассматриваться отдельно, что значительно упрощает дело; отметив, что любое значение типа a изоморфно функции типа () -> a, вы можете превратить ее в какую-то двухуровневую версию Arrow в простой форме.

С другой стороны, включение Monad подразумевает некоторую степень чередования между функциями и контекстом маркировки, что усложняет вопросы по причинам, аналогичным тем, что обсуждаются в ответах на этот вопрос .