【发布时间】:2021-01-29 19:58:16
【问题描述】:
我有这个代码:
ghci>let listOfFuns = map (*) [0..]
ghci>(listOfFuns !! 4) 5
20
-
这是什么!!什么意思?
我看到了这样的双感叹号的例子:
ghci> [1,2,3,4]!!1 ghci> 2
但它似乎不适用于我的问题示例。
- 如何理解这个函数。需要解释。
【问题讨论】:
标签: haskell
我有这个代码:
ghci>let listOfFuns = map (*) [0..]
ghci>(listOfFuns !! 4) 5
20
这是什么!!什么意思?
我看到了这样的双感叹号的例子:
ghci> [1,2,3,4]!!1 ghci> 2
但它似乎不适用于我的问题示例。
【问题讨论】:
标签: haskell
!! 索引列表。它需要一个列表和一个索引,并返回该索引处的项目。如果索引超出范围,则返回⊥。
【讨论】:
:t (!!) 以获取其类型,该类型可能与 [a] -> Int -> a 类似。由此不难推断,它是根据第二个参数提取出列表的其中一个元素。
可能会发现在等值中更容易思考
let listOfFuns = map (*) [0..] in (listOfFuns !! 4) 5
== (map (*) [0..] !! 4) 5
== (map (*) [0, 1, 2, ...] !! 4) 5
== ([(0*), (1*), (2*), ...] !! 4) 5
== (4*) 5
== 20
你可以在这里看到map (*) [0..] 是一个 [Int → Int],所以当你取它的第三个元素(这就是 !! 4 所做的)你会得到一个函数 Int → Int。最后将 5 应用于该函数,得到 20。
【讨论】: