Ответ 1
Я нахожу эти примеры хитрыми рассуждениями. В этом списке есть два списка Например, внешний список - это поток, который ваша стрелка работает, в то время как внутренние списки - это mapA карты. Рассмотрим более простой пример, чтобы мы на данный момент может игнорировать рекурсивный случай. Учитывая,
runSF (mapA (delay 0)) [[1], [2]]
Мы видим, что первый шаг
- Проводящий вход через стрелку
listcase
дает нам вывод[Right (1, []), Right (2, [])]
. Первые элементы каждой пары подаются на стрелкуdelay 0
, а вторые элементы подаются вернуться кmapA f
. - Итак, мы имеем
[1, 2] => delay 0
и[[], []] => mapA f
. Подача[1,2]
вdelay 0
дает результат[0, 1]
и загрузка пустых списков наmapA f
дает больше пустых списков[[], []]
. -
Эти два результата подаются на
arr (uncurry (:))
, который действует какzipWith (:)
, поскольку эти функции отображаются по спискам, поэтому он объединяет два входа перечисляет элементы.[0, 1] | v arr (uncurry (:)) => [ 0:[], 1:[] ] == [[0], [1]] ^ | [[], []]
Ключ должен признать, что все содержимое, построенное с помощью arr
, работает
внутренний набор списков, поэтому запуск начального ввода через arr listcase
не производит Right ([1,2,3],[[4,5,6],[7,8,9]])
, но
[Right (1, [2, 3]), Right (4, [5,6]), Right (7, [8,9])]
.
Это моя попытка вывести его на диаграмму.
[Right (1, [2, 3]), Right (4, [5,6]), Right (7, [8,9])]
=======================================================
| [1, 4, 7] +-----------+ [0, 1, 4]
+----------+ | +----=--------->| delay |-----=------|
| listcase |---=------>| +-----------+ | +-------------------+
+----------+ | +-->| arr (uncurry (:)) |---> [[0,0,0],[1,2,3],[4,5,6]]
| | +-------------------+
| +-----------+ |
+-------=------>| mapA f |------=-----|
| +-----------+ |
| |
[[2,3],[4,5],[6,7]] [[0,0], [2,3],[4,5]]
* what will be
returned if you
trace it through
Извините, что я не могу сделать это лучше. Фактически, mapA
дает транспонированный вид
списка входных данных, поэтому вы можете думать о mapA (delay 0)
как о действующем
transpose . map (init . (0:)) . transpose
, так как init . (0:)
- это
определение delay
.