вот замечательный пост. собственно, замечателен не сам пост, а комменты, половину которых занимает диалог страждущего [узнать, что такое монады] и enlightened one, пытающегося объяснить. замечателен тем, сколько усилий потрачено и с той, и с другой стороны. замечателен также и тем, что в процессе объяснения enlightened one даёт две формальные спецификации, а именно:
public interface Monad<F> {
<A,B,C> Func<A,F<C>> bind(Func<A,F<B> f1, Func<B,F<C>> f2);
}
и
interface Monad<A> {
Monad<A> point(A a);
Monad<B> bind(Func<A,Monad<B>>);
}
причём обе спецификации неверны, как семантически, так и синтаксически. правильная спецификация выглядит примерно так:
interface Monad<A> {
Monad<A> create(A a);
Monad<B> bind(Monad<A> ma, Func<A, Monad<B>> func);
}
public interface Monad<F> {
<A,B,C> Func<A,F<C>> bind(Func<A,F<B> f1, Func<B,F<C>> f2);
}
и
interface Monad<A> {
Monad<A> point(A a);
Monad<B> bind(Func<A,Monad<B>>);
}
причём обе спецификации неверны, как семантически, так и синтаксически. правильная спецификация выглядит примерно так:
interface Monad<A> {
Monad<A> create(A a);
Monad<B> bind(Monad<A> ma, Func<A, Monad<B>> func);
}
(no subject)
Date: 2015-10-01 05:25 pm (UTC)Второе неверно, но из-за point, а не из-за bind.