Я пытаюсь изучить вычислительные выражения F#. В общем, какова цель члена Зеро?
Каково его определение для последовательностей?
Каково его определение для асинхронных рабочих процессов?
Я пытаюсь изучить вычислительные выражения F#. В общем, какова цель члена Зеро?
Каково его определение для последовательностей?
Каково его определение для асинхронных рабочих процессов?
Член Zero
используется, например, когда вы пропускаете ветвь else
в выражении if
:
comp { if b then return 1
return 2 }
... будет переведено примерно так:
comp.Combine
( if b then comp.Return(1) else comp.Zero(),
comp.Return(2) )
Как он определяется для стандартных типов вычислений?
Для асинхронных рабочих процессов он определяется как асинхронный рабочий процесс, который немедленно возвращает единичное значение, что по сути эквивалентно написанию: async { return () }
.
Для последовательностей (где вы используете yield
вместо return
) элемент Zero
возвращает последовательность, которая ничего не возвращает, что соответствует стандартному значению Seq.empty
.
Если вы хотите узнать больше о теоретических основах, вы можете ознакомиться с этот документ. В более теоретических терминах это говорит, что Zero
либо будет return ()
(когда вычисление является монадой), либо будет единицей моноида (когда вычисление является моноидальным), что Хаскеллеры называют mzero
.