Я не знаю точно, что вы просите здесь, но я дам ему выстрелили. Поясните вопрос.
эквивалент в C# на if
, не else
в монадическом рабочем процессе:
from a in b
where c(a)
select a
Логически это эквивалентно (используя Bind, Return и ноль)
Bind(b, a => c(a) ? Return(a) : Zero)
Но C# не опускает предложение where в SelectMany (это то, что C# вызывает Bind). C# понижает где положение в понимании запроса на вызов к
Where(M<T>, Func<T, bool>)
Короче: C# имеет произвольные монадических рабочие процессы в виде постижений запроса; любой монадический тип с методами Select, SelectMany, Where и т. д. может использоваться в понимании. Но на самом деле он не обобщает аддитивные монады с явным нулем. Скорее, «Где» ожидается наличие семантики операции привязки, о которой я говорил выше: она должна иметь тот же эффект, что и привязка единственного значения к концу, если элемент соответствует предикату, а нулевое значение - нет.
Plainly «Where» для последовательностей делает это. Если у вас есть [a, b, c] и вы хотите отфильтровать b, это то же самое, что и объединение [[a], [], [c]]. Но, конечно, было бы безумно неэффективно реально строить и конкатенировать все эти маленькие последовательности. Эффект должен быть таким же, но фактические операции могут быть намного более эффективными.
C# действительно предназначен для поддержки очень специфических монадов: последовательность монад через yield
и понимание запросов, продолжение comonad через await
и так далее. Мы не проектировали его, чтобы разрешить произвольные монадические рабочие процессы, как вы видите в Haskell.
Ответит ли это на ваш вопрос?
Действительно, 'where false' должен иметь семантику, чтобы результат был нулевой монадой. Это хорошая идея. Из этого мы можем видеть такие вещи, как: нуль 'IObservable' монада должна быть наблюдаемой последовательностью, которая * никогда * не вызывает 'OnNext'.Итак, небольшая головоломка: что такое нуль 'Task '? –
Поскольку не может быть разрешено логически возвращать результат, есть только один выбор: 'Task.FromCanceled (new CancellationToken (true))' – Asti
Это разумный выбор, но не единственный; другие возможности - это еще одна задача, которая имеет завершение исключения, или задачу, которая выполняется навсегда и никогда не завершается. –