Я иногда встречал в коде шаблон, напоминающий монаду, но
не поддерживает согласованный тип в >> =
.
Вот простейший пример, который я мог придумать:
(Сначала несколько логических значений уровня типа:
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» не может быть монада, потому что она меняет тип , но я видел это другими (более простыми) способами тоже).