Функция отображения в список / массив в haskell? - PullRequest
2 голосов
/ 27 мая 2019

Я пытаюсь запустить случайный массив, чтобы начать игру.Для этого я создаю функцию randomBoard, которая возвращает '*' или '' для представления пространства на игровом поле.

Я хочу иметь возможность создать массив игровых досок с этой функцией.Я еще не смог создать экземпляр массива.Я надеюсь, что есть способ, которым я могу объявить массив, скажем, размером 100 и использовать мою случайную функцию для установки каждого элемента.

Это, очевидно, не работает и даже не компилируется.Я уверен, что в этом есть пара неправильных вещей, так как я не совсем уверен, как вообще работать с IO в haskell и добиться такого результата.Любое руководство высоко ценится ...

1 Ответ

7 голосов
/ 27 мая 2019

Это должно работать для вас:

import Control.Monad
import System.Random
import Data.Array
import Data.List

randomBoard :: IO Char
randomBoard =
   do
   f1 <- randomIO :: IO Int
   if(f1 `mod` 2) == 0
     then return  '*'
     else return  ' '

boardArray :: IO (Array Int Char)
boardArray = listArray (0, 99) <$> replicateM 100 randomBoard

Вот что я изменил:

  1. Я добавил подпись типа randomBoard :: IO Char для ясности.(Код все равно будет работать без него, поскольку Haskell правильно выведет этот тип, если вы его не предоставите.)
  2. Я изменил тип boardArray, чтобы использовать IO.Все, что использует IO, независимо от того, насколько косвенно, должно быть в самом IO.
  3. Я изменил listArray (0, 100) на listArray (0, 99), так как первый фактически будет 101 элементом.
  4. map randomBoard $ 100 (0,100) совсем не так.Чтобы получить список из нескольких одинаковых вещей, вы обычно используете replicate, но так как вы заботитесь здесь о монаде IO, вы используете вместо нее replicateM.replicateM 100 randomBoard дает IO [Char] со 100 случайными элементами либо '*', либо ' '.
  5. . Я добавил импорт Control.Monad, который необходим для использования replicateM.
  6. Я использую <$> в boardArray.Поскольку вы хотите вызвать listArray с [Char] и получить Array Int Char, но replicateM 100 randomBoard - это IO [Char], вы не можете просто применить аргумент напрямую.Использование <$> (которое также называется fmap) применяет его «внутри» IO, возвращая вам IO (Array Int Char).
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...