Если вы напечатаете результат вызова resume
, вы увидите что-то вроде false attempt to yield across a C-call boundary
, поэтому выполнение завершится неудачно, так как вы пытаетесь yield
из ловушки отладки, что вы не можете сделать (вы нужно будет вернуться с отладочного крючка). Вы можете resume
из ловушки отладки в другую сопрограмму и уступить оттуда, но вы не можете уступить из ловушки.
Может быть, может быть рекомендовано другое решение, если вы объясните, что вы пытаетесь сделать (в редакции).
Я не согласен с другими ответами: Комбинатор с фиксированной точкой (Y) имеет практическое применение , но требует очень образный ум, чтобы найти их. Как Брюс Макадам. Вот отрывок из его статьи That About Wraps it :
Комбинатор Y для вычисления фиксированных точек может быть выражен в стандартном ML. Он часто используется в качестве примера возможностей функций высшего порядка, но обычно не рассматривается как полезная программная конструкция. Здесь мы рассмотрим, как метод программирования, основанный на комбинаторе Y и оболочках, может дать программистам такой уровень контроля над внутренней работой функций, который иначе был бы невозможен без переписывания и перекомпиляции кода. В качестве эксперимента алгоритм вывода типа W реализован с использованием этого метода, так что сообщения об ошибках создаются с минимальным вмешательством в алгоритм. Код для этого примера программы демонстрирует подлинную полезность концепций и легкость их применения. Также обсуждается ряд других методов реализации и возможных приложений, включая использование функций высшего порядка для моделирования использования исключений и продолжений.
Это отличная статья; любой, кто интересуется функциональным программированием, вероятно, получит удовольствие от чтения.
Также обсуждается ряд других методов реализации и возможных приложений, включая использование функций высшего порядка для моделирования использования исключений и продолжений.Это отличная статья; любой, кто интересуется функциональным программированием, вероятно, получит удовольствие от чтения.
Также обсуждается ряд других методов реализации и возможных приложений, включая использование функций высшего порядка для моделирования использования исключений и продолжений.Это отличная статья; любой, кто интересуется функциональным программированием, вероятно, получит удовольствие от чтения.
Комбинатор можно представить как виртуальную машину, которая запускает вашу функцию, которую вы описываете нерекурсивным функционалом (= функцией высшего порядка).
Иногда было бы неплохо иметь этот комбинатор под программным управлением, делать то же самое, что и аспектно-ориентированное программирование (запоминание, трассировка, ...), но ни один язык программирования, который я знаю, не позволяет этого. Вероятно, большую часть времени это было бы слишком громоздко и / или слишком сложно выучить.
Вы можете проверить этот отличный пост о реализации Y Combinator на C #: Рекурсивные лямбда-выражения , это может помочь вам лучше понять идею.
Вы можете почитать несколько хороших статей в Википедии: Комбинатор с фиксированной точкой и Теоремы с фиксированной точкой
] Как говорит Натан, многие функциональные техники связаны с комбинатором Y и полезны, так что продолжайте! Y действительно полезен, потому что позволяет лучше понять ваш код, но я не думаю, что это особенно полезно для описания того, как он помогает.
Другие могут поправить меня, если я ошибаюсь, но я почти уверен, что комбинатор Y строго академический. Подумайте об этом: чтобы реализовать это, ваш язык должен поддерживать функции высшего порядка, но не рекурсию. Я знаю только один такой язык: лямбда-исчисление.
Так что, пока наши машины не переключатся с машин Тьюринга на работу на лямбда-исчислении, Y-комбинатор будет строго академическим.
Примечание: другие функциональные методы, связанные с Y-комбинатором. полезны, так что продолжайте. Понимание комбинатора Y поможет вам понять продолжения, ленивое вычисление и т. Д.