gpt4 book ai didi

list - 初学者对List Comprehension Haskell的疑惑

转载 作者:行者123 更新时间:2023-12-01 11:19:16 25 4
gpt4 key购买 nike

我目前正在做 Wiki 上的 99 个 Haskell 问题。话虽如此,我正在做第 26 题,它需要一个程序,该程序可以用给定集合中的 n 个元素编写所有组合。我用很多函数完成了我的实现,程序看起来是正确的。但我的问题不是来自于此,而是来自 Haskell Wiki 的解决方案之一

combinations :: Int -> [a] -> [[a]]
combinations 0 _ = [ [] ]
combinations n xs = [ y:ys | y:xs' <- tails xs
, ys <- combinations (n-1) xs']

我明白 y:xs为函数 tails 给出的每个列表解析,生成可能值的列表,但我无法理解 ys 是如何产生的值(value)是为了y:ys给我所有正确的解决方案。

另一个更重要的问题是为什么这两个表达式有不同的结果?

[xs | y:xs <- tails [1,2,3]]
[[2,3],[3],[]]

[xs | y:xs <- tails [1,2,3], z <- xs]
[[2,3],[2,3],[3]]

它们可能没有任何实际用途,但它们向我这个 Haskell 初学者展示了一种非常奇怪的行为。为什么申请 z <- xs更改 xs 的值?

最佳答案

由于 comprehension desugaring rules,它们有不同的结果.如果我们有

[ expression | a <- as, b <- bs ]

然后我们会得到

concatMap (\a -> concatMap (\b -> [expression]) bs) as

即使 b 没有在 expression 中使用,我们仍然会得到更多的元素。例如 concatMap (const [1]) [1..10] 将导致 replicate 10 1。因此,如果您在理解中添加另一个列表,您会更改 concatMap 的数量,因此也会更改输出的数量(除非列表只包含一个元素):

[a | a <- [1..10]]             -- results in [1..10]
[a | a <- [1..10], _ <- [1,2]] -- results in [1,1,2,2,3,3,4,4,...,9,9,10,10]
[a | _ <- [1,2], a <- [1..10]] -- results in [1..10] ++ [1..10]

关于list - 初学者对List Comprehension Haskell的疑惑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45951290/

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