データ構造をネストすると、それらを掘り下げるためのコードを手動で記述していることに気付きました。このような:
--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)'
それは私にそれを打つ
- 私はそれが期待した場所のリストを見つけることを理解しています...何か他のもの
- これを修正する方法がわかりません-反復が目的であると思っていたとしても、繰り返し適用するコードを書く必要がありますか?
- これは「持ち上げる」という概念に似ているように見えますが、その直感をどのように適用するかはわかりません。