我已经意识到,当我嵌套数据结构时,我一直在手动编写代码来深入研究它们。就像这样:为什么我不能使用迭代来重复应用地图?
--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)'
它给我的印象是
- 我理解它找到一个列表,其中,预计...别的
- 我不知道如何解决这一问题 - 我应该令状e代码做重复的应用程序,即使这是我认为迭代的目的?
- 这似乎与“提升”的概念类似 - 但我不知道如何应用这种直觉。
谢谢!作为一个相对的Haskell noob,这可能是我第一次碰到一个表示语言限制的错误,而不仅仅是我理解的限制!现在...学习一些Agda :) – nont
它不是不可能的 - 它不建议新手尝试这样的事情,因为它们不是惯用的。如果您有充分的理由这样做,那么您应该明确地询问是否可以使用高级功能,如类型级别的数字。如果可以在Agda中表达,那么可能有可能在Haskell中表达,因为它有很多类型级别的机器,通常以依赖型语言存在。 – nponeccop