gpt4 book ai didi

haskell - 它们之间有什么区别吗?

转载 作者:行者123 更新时间:2023-12-02 02:13:33 25 4
gpt4 key购买 nike

我刚开始学习 Haskell,在阅读“Learn You a Haskell”一书时,我遇到了一个问题。这两种做本质上相同的事情的方式有什么区别:

qtz 1 = [1]
qtz x
| even x = x : qtz (x `div` 2)
| odd x = x : qtz (x * 3 + 1)

-- this
length (filter (>15) (map length (map qtz [1..100])))
-- and this
length (filter (\ xs -> length xs > 15) (map qtz [1..100]))

最佳答案

没有 ,两者都会产生相同的答案,子表达式 filter (>15) (map length (map qtz [1..100])) 存在差异和 filter (\ xs -> length xs > 15) (map qtz [1..100])然而。在前者中,您创建一个长度列表,然后过滤掉小于或等于 15 的元素。 ,所以这给了我们:

Prelude> filter (>15) (map length (map qtz [1..100]))
[17,20,18,18,21,21,16,16,24,112,19,19,19,107,27,22,22,22,35,110,30,17,17,17,105,25,25,25,113,113,20,33,20,33,20,20,108,108,28,28,28,103,23,116,23,23,23,36,36,23,111,111,31,31,18,31,18,93,18,18,106,106,119,26,26,26]

在后者中,我们制作了一个序列列表,我们过滤掉了小于或等于 15 个元素的序列:
Prelude> filter (\ xs -> length xs > 15) (map qtz [1..100])
[[7,22,11,34,17,52,26,13,40,20,10,5,16,8,4,2,1],[9,28,14,7,22,11,34,17,52,26,13,40,20,10,5,16,8,4,2,1],[14,7,22,11,34,17,52,26,13,40,20,10,5,16,8,4,2,1],…]

但这并不重要,因为您调用 length在这些列表中,以及 length对单个元素不感兴趣,而只对元素的数量感兴趣,因此它基本上“丢弃”了列表中的元素。

使用 length确定一个列表是否有超过给定数量的元素通常不是那么有效。如果列表包含数千个元素,它将首先确定长度,然后将其与 15 进行比较.如果列表的长度是无限的,它甚至会陷入无限循环。一些实用程序库提供类似 lengthAtLeast :: Int -> [a] -> Bool 的功能。 ,这将从达到所需长度或列表用尽的那一刻起停止。

因此,您可以将函数重写为:
import Data.List.HT(lengthAtLeast)

(length . filter (lengthAtLeast 16) . map qtz) [1..100]

关于haskell - 它们之间有什么区别吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61709991/

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