Какова цель члена Zero при определении вычислительных выражений F#?

Я пытаюсь изучить вычислительные выражения F#. В общем, какова цель члена Зеро?

Каково его определение для последовательностей?

Каково его определение для асинхронных рабочих процессов?


person mushroom    schedule 09.12.2012    source источник


Ответы (1)


Член 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.

person Tomas Petricek    schedule 09.12.2012