Сомнение Хаскелла: как преобразовать Матрицу, представленную как: [Строка], в Матрицу, представленную как [[Int]]? - PullRequest
2 голосов
/ 02 августа 2010

Я пытаюсь решить Проблема 11 проекта Euler в haskell. Я почти сделал это, но сейчас я застрял, я хочу преобразовать матрицу, представленную как [String] в матрицу, представленную как [[Int]].

Я "нарисовал" матрицы:

Что я хочу:

"08 02 22 97 38 15 00 40                  [ ["08","02","22","97","38","15","00","40"],                [[08,02,22,97,38,15,00,40]
 49 49 99 40 17 81 18 57  map words lines   ["49","49","99","40","17","81","18","57"],      ??a        [49,49,99,40,17,81,18,57]
 81 49 31 73 55 79 14 29  ---------->       ["81","49","31","73","55","79","14","29"],  --------->     [81,49,31,73,55,79,14,29]
 52 70 95 23 04 60 11 42                    ["52","70","95","23","04","60","11","42"],                 [52,70,95,23,04,60,11,42]
 22 31 16 71 51 67 63 89                    ["22","31","16","71","51","67","63","89"],                 [22,31,16,71,51,67,63,89]
 24 47 32 60 99 03 45 02"                   ["24","47","32","60","99","03","45","02"] ]                [24,47,32,60,99,03,45,02]]

Я застрял в выполнении последнего преобразования (?? a)


для любопытства (и обучения) я также хочу знать, как сделать матрицу цифр:

Введите:

"123456789               [ "123456789"                    [ [1,2,3,4,5,6,7,8,9]
 124834924    lines        "124834924"         ??b          [1,2,4,8,3,4,9,2,4]
 328423423  --------->     "328423423"      --------->      [3,2,8,4,2,3,4,2,3]
 334243423                 "334243423"                      [3,3,4,2,4,3,4,2,3]
 932402343"                "932402343" ]                    [9,3,2,4,0,2,3,4,3] ]

Какой лучший способ сделать (?? a) и (?? b)?

1 Ответ

4 голосов
/ 02 августа 2010

То, что вы хотите, это функция read:

read :: (Read a) => String -> a

Это вдумчиво разбирает строку на все, что вы ожидаете (если это экземпляр класса Read, но, к счастью *)1006 * такой).

Так что просто сопоставьте это со словами, например, так:

parseMatrix :: (Read a) => String -> [[a]]
parseMatrix s = map (map read . words) $ lines s

Просто используйте это в контексте, который ожидает [[Int]] и вывод типа Хаскелла примет егооттуда.

Чтобы получить цифры, просто помните, что String на самом деле просто [Char].Вместо использования words отобразите функцию, которая превращает каждый Char в одноэлементный список;все остальное тоже самое.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...