- Left Закон об идентификации:
- Закон о праве на идентичность:
- Ассоциативный закон:
Я читал, что для того, чтобы показать, что объект является монадой, мне нужно будет доказать, что он удовлетворяет всем трем монадическим законам. Кажется, это подразумевает, что все три закона необходимы, и ни один из них не подразумевает другого. Однако мне трудно придумать примеры, в которых Объект может нарушать каждый из монадических законов, не нарушая при этом два других.
Я также не могу найти примеры в Интернете. (Я обнаружил, что некоторые люди говорят, что Java необязательный не соответствует закону о левой идентификации, но он использует значение null любого типа, и некоторые могут утверждать, что это неподходящее значение для необязательного.) Возможно ли, если бы я мог увидеть некоторые из таких примеров ? Заранее спасибо!
Редактировать 1:
Недавно я сдавал экзамен, и на экзамене был пример объекта, который нарушает Закон о правильной идентификации и удовлетворяет требованиям. два других закона. Вот оно:
class Counter {
private final T val;
private final int count;
private Counter(T val, int count) {
this.val = val;
this.count = count;
}
public static Counter of(T val) {
return new Counter(val, 1);
}
public Counter map(Function fn) {
return new Counter(fn.apply(this.val), this.count + 1);
}
public Counter flatMap(Function fn) {
Counter tmp = fn.apply(this.val);
return new Counter(tmp.val, tmp.count);
}
@Override
public boolean equals(Object obj) {
if (this == obj) { return true; }
if (!(obj instanceof Counter)) { return false; }
Counter ctx = (Counter) obj;
return this.val.equals(ctx.val) && this.count == ctx.count;
}
}
Подробнее здесь: https://stackoverflow.com/questions/746 ... ct-is-a-mo
Мобильная версия