Монады продолжений?

Один из подходов будет таким:

#if defined(MON_TARGET_A)
  #define MON_TARGET_NAME "App A"
#elif defined(MON_TARGET_B)
  #define MON_TARGET_NAME "App B"
#else
  #error "which target are you building?"
#endif

Затем добавьте MON_TARGET_A или MON_TARGET_B в настройки препроцессора вашей цели.

Обычно вы будете использовать GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS, а не GCC_PREPROCESSOR_DEFINITIONS, потому что последний может предотвратить совместное использование заголовков PCH.

Чтобы добавить это, перейдите к:

  • Навигатор проектов -> Проект -> Целевая -> Построить настройки

, затем отбросить GCC_PREPROCESSOR_DEFINITIONS_NOT_USED_IN_PRECOMPS в поле поиска и установить его значение примерно так: MON_TARGET_A $(inherited)

16
задан troelskn 21 March 2009 в 15:01
поделиться

5 ответов

Кратко, так как 'связывание' монады берет эффективное продолжение (лямбда 'отдыха вычисления') как аргумент, монады являются продолжениями в этом смысле. На обороте передающий продолжение стиль может быть эффективно реализован на языке не-CPS с помощью одноместного сахара синтаксиса, как предложено многими misc ссылками ниже.

От 'все о монадах' учебное руководство в Haskell:

https://www.haskell.org/haskellwiki/All_About_Monads#The_Continuation_monad

монада продолжения F#, используемая, чтобы реализовать 'повреждение' и 'продолжиться' для for-style-loops

http://cs.hubfs.net/forums/thread/9311.aspx

И примера применения монады продолжения к проблеме в F#:

http://lorgonblog.spaces.live.com/blog/cns!701679AD17B6D310!256.entry

17
ответ дан 30 November 2019 в 15:38
поделиться

Не только монады продолжений, но и они - своего рода универсальная монада, в том смысле, что, если у Вас есть продолжения и состояние, можно моделировать любую функциональную монаду. Этот впечатляющий, но очень технический результат прибывает из впечатляющего и очень технического ума Andrzej Filinski , кто записал в 1994 или поблизости:

Мы показываем, что любая монада, единица которой и дополнительные операции являются выразимыми как чисто функциональное отношение, может быть встроена в язык вызова по значению с “composable continuations”.

23
ответ дан 30 November 2019 в 15:38
поделиться

Они могут быть, хотя они не должны быть. Я инвертировал бы Ваш вопрос немного и сказал бы вместо этого, что монады являются способом реализовать продолжения. Но можно реализовать продолжения во многих отношениях - можно сделать скромное, но ограниченное факсимиле CPS в C# без слишком большого усилия, , например . Взгляните на Монада Продолжения от сайта Haskell для очень полной обработки.

6
ответ дан 30 November 2019 в 15:38
поделиться

Очень хорошая статья на эту тему: http://blog.sigfpe.com/2008/12/mother-of-all-monads.html

4
ответ дан 30 November 2019 в 15:38
поделиться

Продолжение - это особая функция в программе. Монады - это конструкторы типов.

Конструктор типа Cont для продолжений, принимающих тип T , не будет монадой.

Однако Cont > - это монада, и это то, что обычно называют «продолжением монады».

(Наличие callcc на языке эквивалентно возможности конвертировать из Cont > в T .)

1
ответ дан 30 November 2019 в 15:38
поделиться
Другие вопросы по тегам:

Похожие вопросы: