索引处的增量元素

时间:2018-11-10 21:51:44

标签: arrays elm maybe

我正在guide.elm-lang website上的Random example上工作。 我正在尝试添加一项功能,向您显示掷骰子的总次数,以及每张面孔获得多少次的统计信息。

为此,我将模型更改为如下形式:

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的方法。

总的来说,我的问题是。在elm中增加数组索引[x]处的元素的好方法是什么?或者,如果我只是在想这个错误,榆树路会是什么?

1 个答案:

答案 0 :(得分: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