Haskell: Нужно добавить поле массива в структуру данных - PullRequest
1 голос
/ 13 апреля 2019

Я новичок в Хаскеле. Я хочу добавить поле массива в мою структуру данных, что-то вроде этого:

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

Но я не знаю, как объявить тип поля. Это продолжает давать мне ошибки.

Ответы [ 2 ]

2 голосов
/ 13 апреля 2019

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))

2D-массив целых чисел будет иметь тип 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

Какие типы вы используете, зависит от конкретной проблемы, с которой вы столкнулись »Решая, конечно.

1 голос
/ 13 апреля 2019

Data.Array.Ix - это не тип, а класс типов, которые можно использовать в качестве индекса для массива (например, Int).

Вы можете использовать либо Array из Data.Array.IArray (для неизменяемых массивов), либо IOArray / STArray из Data.Array.IO или Data.Array.ST (для изменяемых массивов). Примерно так будет работать:

import Data.Array.IArray

type SomeType = String

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