首页 > 解决方案 > 访问二维数组 Elm 中的元素

问题描述

如何使用 Array.get 获取此数组中的某些元素?

首先我有一个二维列表:

node = [['X',' ',' '],['O','O',' '],['X',' ',' ']]
-- so node is a [['X','X',' '],[' ',' ',' '],[' ',' ',' ']] : List (List Char)

我将它转换为二维数组,所以我得到:

Array.fromList [Array.fromList ['X','X',' '],Array.fromList [' ',' ',' '],Array.fromList [' ',' ',' ']] : Array.Array (Array.Array Char)

虽然附注:为什么repl给我,而不是仅仅将其报告为[['X','X',''],['','',''],['','',' ']] : Array.Array (Array.Array Char) ? 只是想知道,认为这很奇怪。

所以现在节点是一个二维数组而不是一个列表。

现在,如果我想访问[0][1]2D 数组中 say 位置的值,那么'X'第一行中的第二个(所以这是索引 1)2D 数组,我该怎么做get呢?

一旦我弄清楚如何做到这一点,那么我将需要弄清楚如何更新该位置,例如将 X 更改为 O 或将空位置更改为 X 或 O

是我还是只是想在 elm 中使用 2D 列表或 2D 数组只是一个巨大的 PITA?

标签: elm

解决方案


是我还是只是想在 elm 中使用 2D 列表或 2D 数组只是一个巨大的 PITA?

链表是函数式语言中更常见的结构,大多数关于算法的推理都是基于它们的,这就是为什么使用经典数组有时会很乏味(选择是查看应用程序的结构并使列表适合这个结构体)。

关于这个问题,假设你有这样一个功能:

arrayNode : Array.Array (Array.Array Char)
arrayNode = Array.fromList [Array.fromList ['X','X',' '],Array.fromList [' ',' ',' '],Array.fromList [' ',' ',' ']]

0在此数组中获取一行Array.get函数,可以使用:

Array.get 0 arrayNode

据我了解,困难在于Maybe (Array.Array Char)返回类型,所以我们不能Array.get马上再使用一次。

我们可以使用case表达式检查结果是否为Just (Array.Array Char)or Nothing,但实际上有Maybe.andThen函数,可以简化代码:

Array.get 0 arrayNode |> Maybe.andThen (Array.get 1)

结果Just 'X'如预期的那样


推荐阅读