Ожидаемый тип: String, Actual type [[Char]] сообщение об ошибке в Haskell - PullRequest
0 голосов
/ 16 апреля 2020

Я работаю над реализацией Haskell настольной игры Отелло и все еще в начале процесса. В настоящее время я пытаюсь создать функцию, которая будет отображать доску. Сейчас я просто пытаюсь получить функцию для вывода значения координат каждой ячейки. Моя идея состоит в том, что я могу пройти через каждую строку, а затем через каждую ячейку и вывести значение каждой. Затем я вызываю эту функцию в main и выводю плату в виде строки.

Однако у меня возникают проблемы с конкатенацией строк, и я сталкиваюсь с ошибкой «Ожидаемый тип: String, Фактический тип: [[Char]].

Я знаю, что в Haskell String, по сути, является псевдонимом [Char], но я не понимаю, почему я получаю [[Char]], когда использую функцию "++".

showGameState :: GameState -> String
showGameState g =
      let boardStart = (1,1)
      in drawBoard boardStart (board g) (size $ board g)

//the standard board is size 8*8
//here im trying to recursively call the drawBoardRow function increasing the row each time
drawBoard :: (Int, Int) -> Board -> Int -> String
drawBoard pos b len =
      let string = ""
      in if len > 0
              then string ++ (drawBoardRow pos (size b) : [drawBoard (fst pos, snd pos +1) (b) (len - 1)])
              else return string


//callig the drawBoardCell function recursively increasing the column position each time
drawBoardRow :: (Int, Int) -> Int -> String
drawBoardRow pos len =
      let string = ""
      in if len > 0
              then string ++ (drawBoardCell pos : [drawBoardRow(fst pos + 1, snd pos) (len - 1)]) ++ "\n"
              else return string


//At this stage i simply want to add each the coordinate of the cell the string containing
//the row
drawBoardCell :: (Int, Int) -> String
drawBoardCell pos =
      let string = ""
      in return (string ++ " " ++  show(fst pos) ++ show(snd pos) ++ " ")

В идеале я хочу, чтобы эта функция выводила следующее:

11 21 31 41 51 61 71 81
12 22 32 42 52 62 72 82
13 23 33 43 53 63 73 83
14 24 34 44 54 64 74 84
15 25 35 45 55 65 75 85
16 26 36 46 56 66 76 86
17 27 37 47 57 67 77 78
18 28 38 48 58 68 78 88

Извините, если мой код не очень читаемый или мои идеи неясны, я все еще пытаюсь изучить основы Haskell. Спасибо за ваше время и помощь заранее.

Ответы [ 2 ]

5 голосов
/ 16 апреля 2020

Это потому, что

(drawBoardCell pos : [drawBoardRow(fst pos + 1, snd pos) (len - 1)])

является [String], а не String, и вы не можете добавить String к [String].
(drawBoardCell и drawBoardRow производят String с, поэтому [drawBoardRow ...] - это [String], поэтому все это тоже [String].)

Вам нужно придерживаться ++.

Похоже, вы используете let и return, как если бы это был какой-то другой язык программирования, который вы уже знаете.
Если вы знаете какой-то другой язык программирования, сейчас самое время забыть что вы делаете.

Вам вообще не нужно return здесь, и большинство ваших let не имеют смысла.

Мой собственный дубль для начинающих будет выглядеть так :

drawBoard :: (Int, Int) -> Board -> Int -> String
drawBoard _ _ 0 = ""
drawBoard pos@(x,y) b len =
  drawBoardRow pos (size b) ++ drawBoard (x, y + 1) b (len - 1)

drawBoardRow :: (Int, Int) -> Int -> String
drawBoardRow _ 0 = ""
drawBoardRow pos@(x, y) len =
  drawBoardCell pos ++ drawBoardRow(x + 1, y) (len - 1) ++ "\n"

drawBoardCell :: (Int, Int) -> String
drawBoardCell (x, y) = " " ++  show x ++ show y ++ " "
2 голосов
/ 16 апреля 2020

Это потому, что вы используете return, как это Java или что-то в этом роде. Избавьтесь от всех ваших return, которые вы показали нам здесь, и попробуйте снова, и это должно сработать.

...