在索引处增加元素

3
我正在为guide.elm-lang网站上的Random示例添加一个功能,以显示您投掷骰子的总次数以及每个面出现的次数统计信息。
为此,我已将模型更改为以下内容:
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
}

这会抛出一个错误,告诉我:

This get call produces:

#Maybe# Int

But (+) only works with #Int# and #Float# values.

这里涉及到Array.get返回的不是一个Int而是一个Maybe,因此我无法将其添加到数字1上。

我尝试使用列表来实现相同的目的,但由于它们没有索引,我不确定在映射时应该增加什么。我考虑使用记录来做到这一点,并找出一种将记录键映射到face Int的方法。

总的来说,我的问题是,在elm中如何对数组中索引为[x]的元素进行递增?或者如果我只是想错了,那么什么是elm的正确方式?

1个回答

5

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,如果你不介意额外的依赖。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接