gpt4 book ai didi

haskell - 结合 Haskell 代码的片段以获得更大的图景

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

这是我在某个地方遇到的代码,但想知道它是如何工作的:

    findIndices :: (a -> Bool) -> [a] -> [Int]
findIndices _ [] = []
findIndices pred xs = map fst (filter (pred . snd) (zip [0..] xs))

输出:findIndices (== 0) [1,2,0,3,0] == [2,4] , 其中 pred(==0) & xs[1,2,0,3,0]
我将展示我的一些理解:
    (zip [0..] xs)

上面这行所做的是将索引放入列表中的所有内容。对于上面给出的输入,它看起来像这样: [(0,1),(1,2),(2,0),(3,3),(4,0)] .
    (pred . snd)

我发现这意味着类似于 pred (snd (x)) .我的问题是,是 x列表来自 zip线?我倾向于是的,但我的猜测是站不住脚的。

接下来是我对 fst的理解和 snd .我知道
    fst(1,2) = 1 


    snd(1,2) = 2

这两个命令在代码中如何有意义?

我对 filter 的理解是它返回匹配条件的项目列表。例如,
    listBiggerThen5 = filter (>5) [1,2,3,4,5,6,7,8,9,10]

会给 [6,7,8,9,10]
我对 map 的理解是它对列表中的每个项目都应用了一个函数。例如,
    times4 :: Int -> Int
times4 x = x * 4
listTimes4 = map times4 [1,2,3,4,5]

会给 [4,8,12,16,20]
这总体上如何运作?我想我到目前为止所知道的已经很全面了,但不能把这些部分放在一起。有人可以帮帮我吗?

最佳答案

I found that this means something like pred (snd (x)). My question is, is x the list made from the zip line? I'm leaning towards yes but my guess is flimsy.



pred . snd , 表示 \x -> pred (snd x) .所以这基本上构造了一个映射元素 x的函数在 pred (snd x) .

因此,这意味着表达式看起来像:
filter (\x -> pred (snd x)) (zip [0..] xs)

这里 x因此是由 zip 生成的 2 元组.所以为了知道 (0, 1) , (1,2) , (2, 0)等都保留在结果中, snd x将采用这些 2 元组的第二个元素(所以 120 等),并检查 pred在 tha 元素上是否满足。如果满足,它将保留该元素,否则该元素(2元组)将被过滤掉。

所以如果 (== 0)pred icate,然后 filter (pred . snd) (zip [0..] xs)将包含 2 元组 [(2, 0), (4, 0)] .

但现在结果是一个 2 元组列表。如果我们想要索引,我们需要以某种方式摆脱 2 元组以及这些 2 元组的第二个元素。我们使用 fst :: (a, b) -> a 为此:这在其第一个元素上映射了一个 2 元组。所以对于列表 [(2, 0), (4, 0)] , map fst [(2, 0), (4, 0)]将返回 [2, 4] .

关于haskell - 结合 Haskell 代码的片段以获得更大的图景,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61048638/

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