Haskell:希望在数据结构中添加数组字段

问题描述 投票:1回答:2

我是Haskell的新手。我想在我的数据结构中添加一个数组字段,如下所示:

data Level = Level
    { a :: Data.Array.Ix
    } deriving (Show, Eq, Ord)

但我不知道如何声明该字段的类型。它一直给我错误。

haskell ghci
2个回答
2
投票

Ix不是一种类型,而是Data.Array函数用来提供不同形状数组索引的类型类。如果你想要一个数组本身,你需要使用Array类型。它有两个类型参数:数组中的索引类型,例如Int(对于1D数组)或(Int, Int)(对于2D数组),以及元素的类型。

例如,一维字符数组的类型为Array Int Char;您可以使用arraylistArrayaccumArray等函数创建数组,例如:在GHCi:

-- A 5-element array of characters
> example1 = listArray (0, 4) "abcde"

> example1 ! 2
'c'

-- A 3-element array of strings
> example2 = array (0, 2) [(0, "this"), (1, "that"), (2, "other")] :: Array Int String

> example2 ! 2
"other"

> example2 ! 3
*** Exception: Ix{Int}.index: Index (3) out of range ((0,2))

二维整数数组的类型为Array (Int, Int) Int

-- A 3x3 matrix of numbers
> example3 = listArray ((0, 0), (2, 2)) [1..9]

> example3
array ((0,0),(2,2)) [((0,0),1),((0,1),2),((0,2),3),((1,0),4),((1,1),5),((1,2),6),((2,0),7),((2,1),8),((2,2),9)]

> elems example3
[1,2,3,4,5,6,7,8,9]

> bounds example3
((0,0),(2,2))

> example3 ! (1, 2)
6

因此,例如,如果您想要代表Tic-Tac-Toe板,您可能会使用以下内容:

import Data.Array

data Board = Board
    { boardCells :: Array (Int, Int) Move
    } deriving (Show, Eq, Ord)

data Move = Empty | X | O

您使用的类型取决于您正在解决的实际问题。


1
投票

Data.Array.Ix不是一个类型,而是一类可以用作数组索引的类型(如Int)。

你可能想要使用来自ArrayData.Array.IArray(对于不可变数组),或者来自IOArraySTArray的Qazxswpoi / Data.Array.IO(对于可变数组)。像这样的东西会起作用:

Data.Array.ST
© www.soinside.com 2019 - 2024. All rights reserved.