Элемент приращения в индексе - PullRequest
0 голосов
/ 11 ноября 2018

Я работаю на сайте 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
}

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

Этот get вызов производит:

#Maybe# Int

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

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

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

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

1 Ответ

0 голосов
/ 11 ноября 2018

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, если не возражаете против дополнительной зависимости.

...