Инкрементный элемент по индексу

Я работаю на веб-сайте guide.elm-lang на случайном примере . Я пытаюсь добавить функцию, которая показывает вам общее количество раз, когда вы бросали кости, и некоторые статистические данные о том, сколько раз вы получили каждое лицо.

Для этого я изменил модель, чтобы она выглядела так:

type alias Model =
  { 
    die_face : Int,
    total_throws : Int,
    stats: Array.Array Int
  }

и это то, что я делаю, чтобы обновить модель:

{ model | 
     die_face = face, 
     total_throws = model.total_throws + 1, 
     stats = Array.set face ((Array.get face model.stats) + 1) model.stats
}

это вызывает ошибку, которая говорит мне:

Этот вызов вызывает:

#Maybe# Int

Но (+) работает только с # Int # и # Float # значениями.

Это относится к Array.get не возвращающему Int но Maybe и поэтому я не могу добавить его к номеру 1.

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

В общем, мой вопрос. Что такое хороший метод для увеличения элемента в индексе [x] массива в вяз? Или, если я просто думаю об этом неправильно, что будет вяза?

Всего 1 ответ


Array.get возвращает значение Maybe потому что он должен учитывать случай, когда индекс находится вне массива. Самый простой способ обойти это - использовать Maybe.withDefault с разумным значением по умолчанию:

 Array.set face (((Array.get face model.stats) |> Maybe.withDefault 0) + 1) model.stats 

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

 incrementAt : Int -> Array Int -> Array Int incrementAt index array = case Array.get index array of Just value -> Array.set index (value + 1) array Nothing -> array 

Вы также можете использовать Array.Extra.update если вы не возражаете против дополнительной зависимости.


Есть идеи?

10000