Re[13]: Почему C# не Немерле
От: Klapaucius  
Дата: 28.11.08 10:33
Оценка:
Здравствуйте, AndrewVK, Вы писали:

AVK>Тут уже как то кое кто уже демонстрировал, что, в принципе, монады можно найти практически во всем. Ну, типа, как паттерн MVC.


Ну, монада — это всего-навсего пара операций, для которых постулируются несколько аксиом, и нейтральный элемент.
Так что определить что есть монада можно с математической точностью, в отличие от MVC.
Монады могут быть вообще в любом языке, в котором есть ФВП. В некоторых языках они есть в стандарной библиотеке, а в некоторых (в Haskell, C# 3.0, F#) есть синтаксический сахар для них вроде do-нотации Хаскела.
Т.е.
x <- mx

from x in mx // SelectMany - это bind

let! x = mx

Вот пример
Автор: desco
Дата: 26.11.08
использования монад из библиотеки F# в C#.

Непонятно, почему монады из F# Gaperton считает "гражданскими". Потому, что они там не позиционируются как что-то мозголомное?
... << RSDN@Home 1.2.0 alpha 4 rev. 1110>>
'You may call it "nonsense" if you like, but I'VE heard nonsense, compared with which that would be as sensible as a dictionary!' (c) Lewis Carroll
Re[14]: Почему C# не Немерле
От: AndrewVK Россия http://blogs.rsdn.org/avk
Дата: 28.11.08 12:13
Оценка:
Здравствуйте, Klapaucius, Вы писали:

K>
K>from x in mx // SelectMany - это bind
K>


Почему SelectMany? Это просто Select.
... << RSDN@Home 1.2.0 alpha 4 rev. 1111 on Windows Vista 6.0.6001.65536>>
AVK Blog
Re[15]: Почему C# не Немерле
От: Klapaucius  
Дата: 28.11.08 14:56
Оценка:
Здравствуйте, AndrewVK, Вы писали:

K>>
K>>from x in mx // SelectMany - это bind
K>>

AVK>Почему SelectMany? Это просто Select.

Ну, если уж на то пошло, это фрагмент кода, который сам по себе не работает, но семантически аналогичен другим двум приведенным фрагментам.
Поэтому комментарий и приведен, что bind — это SelectMany, но не Select. Select — это map.
Для SelectMany все выполняется:
// псевдокод, естественно
// 1) Left Identity
Unit(x).SelectMany(k) == k(x)
// 2) Right Identity
mx.SelectMany(Unit) == mx
// 3) Associative
mx.SelectMany(x => k(x).SelectMany(h)) == mx.SelectMany(k).SelectMany(h)


// где:
IEnumerable<T> Unit<T>(T x)
{
    yield return x;
}
T x;
IEnumerable<T> mx;
IEnumerable<T> k<T>(T x);
IEnumerable<T> h<T>(T h);
... << RSDN@Home 1.2.0 alpha 4 rev. 1110>>
'You may call it "nonsense" if you like, but I'VE heard nonsense, compared with which that would be as sensible as a dictionary!' (c) Lewis Carroll
Re[16]: Почему C# не Немерле
От: AndrewVK Россия http://blogs.rsdn.org/avk
Дата: 28.11.08 15:08
Оценка: +1
Здравствуйте, Klapaucius, Вы писали:

K>Ну, если уж на то пошло, это фрагмент кода, который сам по себе не работает, но семантически аналогичен другим двум приведенным фрагментам.


Ну вот тем не менее для SelectMany нужно как минимум 2 from
... << RSDN@Home 1.2.0 alpha 4 rev. 1111 on Windows Vista 6.0.6001.65536>>
AVK Blog
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.