gpt4 book ai didi

haskell - (+1) 在这里计算了多少次?

转载 作者:行者123 更新时间:2023-12-04 16:33:16 26 4
gpt4 key购买 nike

在我的函数式编程考试中,我有以下问题:

在以下代码中计算了 (+1) 函数多少次?

(map (+ 1) [1 .. 10]) !! 5

其中 index 函数定义如下:
(h:_) !! 0 = h
(_:t) !! x = t !! (x-1)

我会说 6 次,但正确答案似乎是 1,我不明白为什么。我在 Haskell 中找不到对惰性求值的足够好的解释,所以我想知道正确答案是什么以及为什么。先感谢您!

最佳答案

many times is (+ 1) function computed in the following code?



它只计算一次。 map不强制计算 f xi在结果列表中的元素上。这些计算被推迟(就像 Haskell 中的其他一切一样),只有当我们需要计算特定项目的值(value)时,我们才这样做。
mapchapter 9 of the Haskell'10 report 中指定作为:

-- Map and append  
map :: (a -> b) -> [a] -> [b]
map f [] = []
map f (x:xs) = f x : map f xs


没有 seq 、刘海图案等在这里给力评价 f x ,所以 map函数确实会“产生”一个 f x ,但不评估 f x ,它被推迟到有必要时(并且可能发生我们对这些值中的一些不感兴趣,因此可以节省一些 CPU 周期)。

我们可以看看 Haskell 将如何评估这一点:
   (!!) (map (+ 1) [1 .. 10]) 5
-> (!!) ((+1) 1 : map (+1) [2..10]) 5
-> (!!) (map (+1) [2..10]) 4
-> (!!) ((+1) 1 : map (+1) [3..10]) 4
-> (!!) (map (+1) [3..10]) 3
-> (!!) ((+1) 1 : map (+1) [4..10]) 3
-> (!!) (map (+1) [4..10]) 2
-> (!!) ((+1) 1 : map (+1) [5..10]) 2
-> (!!) (map (+1) [5..10]) 1
-> (!!) ((+1) 1 : map (+1) [6..10]) 1
-> (!!) (map (+1) [6..10]) 0
-> (!!) ((+1) 6 : map (+1) [7..10]) 0
-> (+1) 6
-> 7

这是因为 map f [x1, x2, ..., xn]最终映射到列表 [f x1, f x2, ..., f xn] ,但它不计算 f xi在元素中,该计算被推迟,直到我们真正需要该列表中的值,并用它做一些事情(比如打印它)。

鉴于 f,这可能会显着提高性能是一个开销很大的函数,我们只需要列表中少量元素的值。

关于haskell - (+1) 在这里计算了多少次?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56408750/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com