【问题标题】:Increment element at index在索引处增加元素
【发布时间】:2018-11-10 21:51:44
【问题描述】:

我正在处理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] 处增加元素的好方法是什么?或者如果我只是在想这个错误,那么榆树的方法是什么?

【问题讨论】:

    标签: arrays elm maybe


    【解决方案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

    【讨论】:

      猜你喜欢
      • 2016-03-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-05-18
      • 1970-01-01
      • 1970-01-01
      • 2012-09-02
      • 2020-03-11
      相关资源
      最近更新 更多