Почему нам нужно проверять все три монадических закона при проверке того, является ли объект монадой?JAVA

Программисты JAVA общаются здесь
Ответить
Anonymous
 Почему нам нужно проверять все три монадических закона при проверке того, является ли объект монадой?

Сообщение Anonymous »

Насколько я понимаю, три монадических закона таковы (я работаю на Java, а не на Haskell, поэтому прошу прощения за синтаксис):
  • Left Закон об идентификации:
Monad.of(x).flatMap(y -> f(y)) = f(x)
  • Закон о праве на идентичность:
monad.flatMap(y -> Monad.of(y)) = monad
  • Ассоциативный закон:
monad.flatMap(x -> f(x)).flatMap(x -> g(x)) = monad.flatMap(x -> f(x).flatMap(x -> g(x)))

Я читал, что для того, чтобы показать, что объект является монадой, мне нужно будет доказать, что он удовлетворяет всем трем монадическим законам. Кажется, это подразумевает, что все три закона необходимы, и ни один из них не подразумевает другого. Однако мне трудно придумать примеры, в которых Объект может нарушать каждый из монадических законов, не нарушая при этом два других.
Я также не могу найти примеры в Интернете. (Я обнаружил, что некоторые люди говорят, что 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
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «JAVA»