Проблема в том, что ваша Delay
функция в компоновщике вычислений немедленно вызывает функцию - это означает, что когда вы вызываете mapk
, она немедленно запускает сопоставление с образцом и затем рекурсивно вызывает mapk
(перед передачей ее результат операции Bind
).
Вы можете исправить это, используя реализацию Delay
, которая возвращает функцию, которая вызывает f
только после того, как ей дано окончательное продолжение - таким образом, рекурсивный вызов просто вернет функцию (без выполнения более рекурсивных вызовов). которые вызывают переполнение стека):
member this.Delay(f) = (fun k -> f () k)
В этой версии Delay
ваш код работает, как и ожидалось.