Functional programming 迭代数组时的Elm减量计数器

Functional programming 迭代数组时的Elm减量计数器,functional-programming,elm,Functional Programming,Elm,我最近决定更深入地研究函数式编程,并决定从Elm开始 我在这方面非常缺乏经验,所以我觉得我实际上在与概念和语言作斗争,我的思维过程都是错误的,所以我希望有人能帮我做一些简单的练习 我正在尝试创建一个扫雷游戏,首先,我只是尝试在网格中填充地雷 这是到目前为止我的代码 import Array exposing (Array) type State = Hidden | Tagged | Revealed type alias Cell = {isMine: Bool, nearbyMines:

我最近决定更深入地研究函数式编程,并决定从Elm开始

我在这方面非常缺乏经验,所以我觉得我实际上在与概念和语言作斗争,我的思维过程都是错误的,所以我希望有人能帮我做一些简单的练习

我正在尝试创建一个扫雷游戏,首先,我只是尝试在网格中填充地雷

这是到目前为止我的代码

import Array exposing (Array)


type State = Hidden | Tagged | Revealed
type alias Cell = {isMine: Bool, nearbyMines: Int, state: State}
type alias Board = Array (Array Cell)

mines : Int
mines = 100

initCell : Cell
initCell = 
  {isMine = False, nearbyMines = 0, state = Hidden}

generate : Int -> Int -> Board
generate lines cols =
  Array.initialize lines (\y -> 
    Array.initialize cols (\x -> initCell))


markAsMine : Int -> Int -> Cell -> Cell
markAsMine x y cell =         
    if mines > 0
    then {cell | isMine = True}
    else cell

fillMines : Int -> Board -> Board
fillMines amount board =
  board
    |> Array.indexedMap (\y row -> row |> Array.indexedMap (\x cell-> markAsMine x y cell))
当然,所有这些都将做的是将每个单元格标记为我的,那么如何在每次我将单元格标记为我的单元格时减少计数器? 这应该是一些琐碎的事情,因此我认为我正在与不同的编程范式作斗争

提前感谢您的帮助,
干杯

一种功能性更强的方法会尽量避免使用状态。与其考虑遍历一组单元格并递减一个有状态字段,告诉您还有多少地雷尚未布设,不如传入一组已确定为地雷的x,y值

导入集公开集 填充矿:Int->Set Int,Int->Board->Board 矿业委员会= 板 |>Array.indexedMap \y行-> 行|>Array.indexedMap\x cell->{cell | isMine=Set.member x,y} 然后,您将确定哪些x、y单元格是地雷的责任转移到应用程序中的其他位置,并且由于“扫雷者”是一个随机游戏,您可能需要创建一组随机的单元格,这些单元格被指定为地雷。类型签名可以如下所示:

随机输入 雷场生成器:Int->Int->Int->Random。生成器集Int,Int 雷区发电机线路cols numMines=。。。
minefieldGenerator的实现超出了这个问题的范围,但是您可以使用这个生成器,它将让Elm架构在从更新函数内部返回时生成一个随机数,或者,您可以传入一个已知的种子值来执行。

一种更实用的方法会尽量避免使用状态。与其考虑遍历一组单元格并递减一个有状态字段,告诉您还有多少地雷尚未布设,不如传入一组已确定为地雷的x,y值

导入集公开集 填充矿:Int->Set Int,Int->Board->Board 矿业委员会= 板 |>Array.indexedMap \y行-> 行|>Array.indexedMap\x cell->{cell | isMine=Set.member x,y} 然后,您将确定哪些x、y单元格是地雷的责任转移到应用程序中的其他位置,并且由于“扫雷者”是一个随机游戏,您可能需要创建一组随机的单元格,这些单元格被指定为地雷。类型签名可以如下所示:

随机输入 雷场生成器:Int->Int->Int->Random。生成器集Int,Int 雷区发电机线路cols numMines=。。。 minefieldGenerator的实现超出了这个问题的范围,但是您可以使用这个生成器,当从更新函数内部返回时,它将让Elm体系结构生成一个随机数,或者您可以传递一个已知的种子值来执行