amarao: (Default)
[personal profile] amarao
Чем больше я про это думаю, тем больше я его хочу.

Любое замыкание (в расте) может управлять control flow приложения, но только в смысле panic!. Замыкание не может управлять другим control flow, например, break/continue/return.

Это делает не экивалентным цикл итератора и применение map для того же самого итератора. Несправедливо! Если бы только компилятор понимал управление control flow и мог правильно проверить его совместимость...

Date: 2024-05-27 10:04 am (UTC)
From: [personal profile] permeakra
Аннотировал скобками и точками-с-запятой. Оба when, понятное дело, во внутренней лямбде.
testCn rc bc dv l = flip runCont id $ callCC $ \rexit -> do {
  callCC $ \lexit -> forM_ l $ \e -> do{
     when (rc e) $ rexit e;
     when (bc e) $ lexit ();
  };
  return dv;
  }


runCont - раскрывает монадку продолжения
callCC - расставляет точки возврата (куда выходить) и отправляет в свой аргуменет условную 'команду выхода' в эту точку возврата.
forM_ - запустить монадические вычисления на 'iterable' коллекции, и склеить 'слева направо', выкидывая результат. Он получает здесь лямбду, в которую передает элемент. Эта внутренняя лямбда синтаксически захватывает 'команды выхода' из более внешних.

Если тебя смущает $, то это чтоб скобки не размножались. f $ g == f (g) . Удобно, когда нужно отграничить лямбду или сделать длинный пайплайн.
Edited Date: 2024-05-27 03:57 pm (UTC)

Profile

amarao: (Default)
amarao

February 2026

S M T W T F S
123456 7
8910111213 14
15161718192021
22232425262728

Most Popular Tags

Page Summary

Style Credit

Expand Cut Tags

No cut tags
Page generated Feb. 25th, 2026 06:06 pm
Powered by Dreamwidth Studios