У меня возникла идея определить оператор, который принимает (возможно) многомерный список и список индексов и возвращает элемент. Моя прото попытка была:
(!!!) xs [i] = xs !! i
(!!!) xs (cI : restI) = (xs !! cI) !!! restI
Оглядываясь назад, это, очевидно, имеет много проблем. Сначала я не мог определить сигнатуру типа, потом понял, что в строке 2 возвращаемый тип (xs !! cI) будет постоянно меняться и не всегда может быть даже списком (на последней «итерации»)
Я понял, что для доступа к многомерному массиву с помощью стандартного оператора индекса вы можете просто связать его следующим образом:
[[1,2,3],[4,5,6],[7,8,9]] !! 1 !! 1 = 5
И понял, что это очень похоже на складку, поэтому я попробовал:
(!!!) xxs inds = foldl (!!) xxs inds
or simply (!!!) = foldl (!!)
Но я получаю ту же ошибку, что и при первой попытке; что я пытаюсь построить бесконечный тип.
Возможна ли такая функция (через взлом или иным образом)? Я начинаю думать, что его тип просто слишком висит в воздухе, чтобы работать.
В качестве примера я стремился к следующему:
[[1,2,3],[4,5,6],[7,8,9]] !!! [1,1] = 5