Ваше определение (>>=)
, безусловно, неверно, но я не могу указать, где, потому что это так сложно! Вместо этого я объясню, почему это не может быть определено правильно на примере. Рассмотрим:
Rand (\g -> (42,g)) >>= const mzero
Нам нужно вывести это 42
, поэтому нам нужно g
. Место, где можно получить g - это возвращаемое значение привязки, поэтому ответ определенно:
Rand (\g -> ...)
Для некоторых ...
, отвечающих за возврат пары (b,g)
. Теперь, когда у нас есть 42, мы можем оценить const mzero 42
и найти, что у нас есть RandZero
Но где мы собираемся получить это b
? Нигде (на самом деле , поэтому нигде в этом примере не может быть любого типа, поскольку тип выражения forall b. Rand b
).
Какова цель RandZero
для вашей монады? Вы просто пытаетесь сделать StateT g Maybe
? Я думаю, что вы есть. В этом случае вам может повезти, если вы попытаетесь реализовать этот тип:
newtype Rand g a = Rand (g -> Maybe (a, g))