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

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

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

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

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 , Помеченный p - это * -> * , который действует очень похоже на ] м в монада, но другая, как это происходит дальше, когда мы определяем "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 «with» не может быть монада, потому что она меняет тип , но я видел это другими (более простыми) способами тоже).

20
задан Community 23 May 2017 в 12:23
поделиться