Как лучше всего обрабатывать логику IO Bool?

Я часто использую этот шаблон:

f x = do
  -- predicate :: a -> IO Bool
  b <- predicate x
  if b then 
    rest ()
  else
    return ()
  where
    rest () = do
      -- rest of my IO operations

Есть ли шаблон, который другие люди используют для удаления предложений if then else where? Как вам лучше всего работать с потоком управления и IO Bool?

Возможно, связано: Как мне справиться со многими уровнями отступов?.

Daniel Wagner 16.02.2023 13:34

Почему вы пишете rest () вместо просто rest или вместо then do и операций?

user253751 16.02.2023 21:19

Потому что именно так я заставил это работать и не знал об идее then do?

jks612 17.02.2023 17:16
Ускорьте разработку веб-приложений Laravel с помощью этих бесплатных стартовых наборов
Ускорьте разработку веб-приложений Laravel с помощью этих бесплатных стартовых наборов
Laravel - это мощный PHP-фреймворк, используемый для создания масштабируемых и надежных веб-приложений. Одним из преимуществ Laravel является его...
Что такое двойные вопросительные знаки (??) в JavaScript?
Что такое двойные вопросительные знаки (??) в JavaScript?
Как безопасно обрабатывать неопределенные и нулевые значения в коде с помощью Nullish Coalescing
Создание ресурсов API Laravel: Советы по производительности и масштабируемости
Создание ресурсов API Laravel: Советы по производительности и масштабируемости
Создание API-ресурса Laravel может быть непростой задачей. Она требует глубокого понимания возможностей Laravel и лучших практик, чтобы обеспечить...
Как сделать компонент справочного центра с помощью TailwindCSS
Как сделать компонент справочного центра с помощью TailwindCSS
Справочный центр - это веб-сайт, где клиенты могут найти ответы на свои вопросы и решения своих проблем. Созданный для решения многих распространенных...
Асинхронная передача данных с помощью sendBeacon в JavaScript
Асинхронная передача данных с помощью sendBeacon в JavaScript
В современных веб-приложениях отправка данных из JavaScript на стороне клиента на сервер является распространенной задачей. Одним из популярных...
Как подобрать выигрышные акции с помощью анализа и визуализации на Python
Как подобрать выигрышные акции с помощью анализа и визуализации на Python
Отказ от ответственности: Эта статья предназначена только для демонстрации и не должна использоваться в качестве инвестиционного совета.
5
3
95
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Проверьте , когда и , если .

f x = do
  b <- predicate x
  when b $ do
    -- rest of the IO operation

В пакете extra также есть whenM.

В дополнение к when еще одна удобная вещь — и не специфичная для логических значений — это использование -XLambdaCase и оператора открытой привязки, чтобы избежать необходимости вводить переменную:

{-# LANGUAGE LambdaCase #-}

f x = do
   predicate >>= \case
     True -> rest ()
     False -> return ()
  where
    rest () = do
      ...

Кстати, если бы аргументы when были перевернуты, то это можно было бы использовать и в этом стиле:

thenfore :: m () -> Bool -> m ()
thenfore = flip when

f x = do
   predicate >>= thenfore (rest ())
  where
    rest () = do
      ...

...или, встраивая rest,

f x = do
   predicate >>= thenfore`id`do
      ...

Объяснение использования id в качестве оператора: обратите внимание, что id :: a -> a является строго более общим, чем оператор приложения функции ($) :: (a -> b) -> (a -> b), поэтому его можно использовать таким же образом, но он имеет более высокий приоритет и, таким образом, может быть объединен с >>=, как это сделано выше. .

Другие вопросы по теме