Haskell: 希望在数据结构中添加数组字段
Haskell: Looking to add array field in data structure
我是 Haskell 的新手。
我想在我的数据结构中添加一个数组字段,如下所示:
data Level = Level
{ a :: Data.Array.Ix
} deriving (Show, Eq, Ord)
但是我不知道如何声明字段的类型。它一直给我错误。
Data.Array.Ix
不是类型,而是 class 类型,可以用作数组的索引(如 Int
)。
您可能想使用 Data.Array.IArray
中的 Array
(对于不可变数组),或 Data.Array.IO
或 [=18 中的 IOArray
/ STArray
=](对于可变数组)。这样的事情会起作用:
import Data.Array.IArray
type SomeType = String
data Level = Level
{ a :: Data.Array Int SomeType
} deriving (Show, Eq, Ord)
Ix
不是类型,而是 Data.Array
函数用来提供不同形状数组索引的类型类。如果你想要一个数组本身,你需要使用 Array
类型。它有两个类型参数:数组的索引类型,例如 Int
(对于一维数组)或 (Int, Int)
(对于二维数组),以及元素的类型。
例如,一维字符数组的类型为 Array Int Char
;您可以使用 array
、listArray
或 accumArray
等函数创建数组,例如在 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
因此,例如,如果您想表示井字棋盘,您可以使用类似以下内容的内容:
import Data.Array
data Board = Board
{ boardCells :: Array (Int, Int) Move
} deriving (Show, Eq, Ord)
data Move = Empty | X | O
当然,您使用哪种类型取决于您要解决的实际问题。
我是 Haskell 的新手。 我想在我的数据结构中添加一个数组字段,如下所示:
data Level = Level
{ a :: Data.Array.Ix
} deriving (Show, Eq, Ord)
但是我不知道如何声明字段的类型。它一直给我错误。
Data.Array.Ix
不是类型,而是 class 类型,可以用作数组的索引(如 Int
)。
您可能想使用 Data.Array.IArray
中的 Array
(对于不可变数组),或 Data.Array.IO
或 [=18 中的 IOArray
/ STArray
=](对于可变数组)。这样的事情会起作用:
import Data.Array.IArray
type SomeType = String
data Level = Level
{ a :: Data.Array Int SomeType
} deriving (Show, Eq, Ord)
Ix
不是类型,而是 Data.Array
函数用来提供不同形状数组索引的类型类。如果你想要一个数组本身,你需要使用 Array
类型。它有两个类型参数:数组的索引类型,例如 Int
(对于一维数组)或 (Int, Int)
(对于二维数组),以及元素的类型。
例如,一维字符数组的类型为 Array Int Char
;您可以使用 array
、listArray
或 accumArray
等函数创建数组,例如在 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
因此,例如,如果您想表示井字棋盘,您可以使用类似以下内容的内容:
import Data.Array
data Board = Board
{ boardCells :: Array (Int, Int) Move
} deriving (Show, Eq, Ord)
data Move = Empty | X | O
当然,您使用哪种类型取决于您要解决的实际问题。