Ваш первый случай не является необходимым, и есть ошибка в вашем втором случае:
map (\a -> stoline a) val ++ ...
val
здесь [String]
, так map (\a -> stoline a) val
является [[Obj]]
. Поскольку вы используете ++
, чтобы объединить его с остальными результатами, ваш конечный результат будет иметь тип [[Obj]]
, а не [Obj]
.
Давайте переделки его:
stomap :: [[String]] -> [Obj]
stomap lolos = concatMap (\los -> concatMap (\s -> stoline s) los) lolos
lolos
список списков строк, los
список строк, и s
является строкой.
Мы используем concatMap
здесь, а не нормальный map
, так как мы хотим, чтобы создать единый список объектов [Obj]
не вложенный список списков списков объектов: [[[Obj]]]
, и так как мы бежим stoline
на каждом String
в ввода, нам нужно свернуть эту структуру, когда мы пройдем lolos
.
Мы можем очистить вышеуказанный код (сделайте его более haskelly), сделав его бесшумным. \s -> stoline s
такая же, как stoline
, так что мы могли бы:
stomap lolos = concatMap (\los -> concatMap stoline los) lolos
\los -> concatMap stoline los
такая же, как concatMap stoline
, так что мы могли бы сократить, что:
stomap lolos = concatMap (concatMap stoline) lolos
И мы можем опустить аргумент с обеих сторон , давая нам:
stomap = concatMap (concatMap stoline)
Сначала это может показаться неразборчивым, но для опытного haskell er, это можно прочитать еще более четко, чем ваш исходный код - мне ясно, что эта последняя версия просто объединяет результаты работы stoline
над списком списков.
FYI, '[Obj]' это список, а не массив. Семантика и время доступа разные.Например, списки имеют O (k) доступ к элементу k'th, а массивы имеют O (1) доступ к k-му элементу. – rampion
Спасибо за комментарий, я исправил его (написав ошибку ..); +1! – Val
Ну, по вашему мнению, Stoline берет строку, а не список строк. –