索引处的增量元素

Nic*_*tti 3 arrays maybe elm

我正在关于随机示例guide.elm-lang网站上工作.我正在尝试添加一个功能,向您显示掷骰子的总次数,以及您获得每张脸的次数的一些统计数据.

为此,我将模型更改为如下所示:

type alias Model =
  { 
    die_face : Int,
    total_throws : Int,
    stats: Array.Array Int
  }
Run Code Online (Sandbox Code Playgroud)

这就是我更新模型的方法:

{ model | 
     die_face = face, 
     total_throws = model.total_throws + 1, 
     stats = Array.set face ((Array.get face model.stats) + 1) model.stats
}
Run Code Online (Sandbox Code Playgroud)

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

get调用产生:

#Maybe# Int
Run Code Online (Sandbox Code Playgroud)

但是(+)仅适用于#Int#和#Float#值.

这指的是Array.get不返回a Int但是Maybe因此我无法将其添加到数字1.

我已经尝试使用列表来实现相同的目的,但由于它们没有编入索引,我不确定当我映射它时会增加什么.我正在考虑使用记录来做到这一点,并想出一种方法将记录键映射到faceInt.

一般来说,我的问题是.在elm中以数组的索引[x]递增元素的好方法是什么?或者,如果我只是想到这个错误,榆树的方式是什么?

gle*_*nsl 5

Array.get返回一个Maybe因为它必须考虑索引在数组之外的情况.最简单的解决方法是使用Maybe.withDefault合理的默认值:

Array.set face (((Array.get face model.stats) |> Maybe.withDefault 0) + 1) model.stats
Run Code Online (Sandbox Code Playgroud)

为此编写辅助函数可能是一个好主意,以便稍微清理代码.像这样的东西:

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
Run Code Online (Sandbox Code Playgroud)

Array.Extra.update如果你不介意额外的依赖,你也可以使用.