我已经意识到,当我嵌套了数据结构时,我一直在手动编写代码来深入研究它们。像这样:
--one level
Prelude> map (*2) [1,2,3]
[2,4,6]
--nested two levels
Prelude> let t2 = map $ map (*2)
Prelude> t2 [[1,2,3],[4,5,6]]
[[2,4,6],[8,10,12]]
--nested three levels
Prelude> let t3 = map $ map $ map (*2)
Prelude> t3 [[ [1,2,3],[4,5,6] ],[ [1,2,3],[4,5,6] ]]
[[[2,4,6],[8,10,12]],[[2,4,6],[8,10,12]]]
所以我突然想到,我应该能够使用更高阶的函数自动构造一个函数来深入研究我的嵌套数据结构:
Prelude> let t f n = (iterate map f) !! n
<interactive>:35:22:
Occurs check: cannot construct the infinite type: b0 = [b0]
Expected type: (a0 -> b0) -> a0 -> b0
Actual type: (a0 -> b0) -> [a0] -> [b0]
In the first argument of `iterate', namely `map'
In the first argument of `(!!)', namely `(iterate map f)'
它让我印象深刻
- 我知道它会在预期的位置找到一个列表……别的
- 我不知道如何解决这个问题 - 我是否应该编写代码来重复应用程序,即使那是我认为 iterate 的用途?
- 这似乎类似于“提升”的概念——但我不知道如何应用这种直觉。