Nano Hash - криптовалюты, майнинг, программирование

Избегайте чистоты изменчивости с помощью сопоставления с образцом и побитового комбинирования флагов перечисления в fsharp

Рассмотрим следующий (изменяемый) пример:

let getRegexFlax flags =
    let mutable res = RegexOptions.None
    for ch in flags do
        match ch with
        | 's' ->  res <- res ||| RegexOptions.Singleline
        | 'x' ->  res <- res ||| RegexOptions.IgnorePatternWhitespace
        | 'i' ->  res <- res ||| RegexOptions.IgnoreCase
        | 'm' ->  res <- res ||| RegexOptions.Multiline
        | _   ->  raise (Exception("invalid flag"))
    res

Я использовал этот пример, чтобы проиллюстрировать ситуацию, с которой мы часто сталкиваемся. Идея проста: на основе строки (или любого сложного условия) вам нужно объединить ноль или более флагов перечисления.

Я думаю, что самый простой способ сделать это, как указано выше, с изменчивым. Если вы не используете mutable, я могу придумать множество других способов, но ни один из них не кажется очень чистым:

  • рекурсивная функция, объединяющая флаги возврата (громоздкая)
  • enum.Combine, как предлагает Дон Сайм, с соответствием if-условию или шаблону в каждой записи массива (уродливо)
  • длинный ряд ||| комбинированных выражений, каждое из которых имеет условное (также уродливое)

Я уверен, что есть более простой и прямой путь, желательно с сопоставлением с образцом и, конечно же, без изменчивости. Может сейчас поздний час дня, но я просто не могу думать об этом в данный момент, кто-нибудь может показать мне свет?


Ответы:


1

Я бы сделал что-то вроде:

let chartoflag ch= 
    match ch with
    | 's' ->   RegexOptions.Singleline
    | 'x' ->   RegexOptions.IgnorePatternWhitespace
    | 'i' ->  RegexOptions.IgnoreCase
    | 'm' ->  RegexOptions.Multiline
    | _   ->  raise (Exception("invalid flag"))

flags |> Seq.map chartoflag |> Seq.fold (|||) RegexOptions.None
07.11.2014

2

Вы можете использовать функцию Seq.fold (при условии, что флаги представляют собой набор символов)

let getRegexFlax1 flags =
    flags 
    |> Seq.fold (fun acc ch -> 
                    match ch with
                    | 's' ->  acc ||| RegexOptions.Singleline
                    | 'x' ->  acc ||| RegexOptions.IgnorePatternWhitespace
                    | 'i' ->  acc ||| RegexOptions.IgnoreCase
                    | 'm' ->  acc |||  RegexOptions.Multiline
                    | _   ->  failwith "invalid flag") RegexOptions.None
07.11.2014
  • Флаги — это строка в моем примере, представляющая собой набор символов, так что это, по сути, тот же ответ, что и Джон, но затем перевернутый, также будет работать. Вопрос в том, что наиболее читабельно ;). 07.11.2014
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..