gpt4 book ai didi

list - Haskell 列表理解 - 所有列表拆分的列表

转载 作者:行者123 更新时间:2023-12-01 01:08:35 26 4
gpt4 key购买 nike

我只是想写一个函数 splits 接受一个列表 l 并返回一个包含所有可能的拆分方式的元组列表 l.

所以它应该像这样工作:

splits "Hello"
[("","Hello"),("H","ello"),("He","llo"),("Hel","lo"),("Hell","o"),("Hello","")]

实现1我写的是这样的:

splits l = [(x,y) | i <- [0 ..length l], x <- take i l, y <- drop i l]

给出

[('H','e'),('H','l'),('H','l'),('H','o'),('H','l'),('H','l'),('H','o'),
('e','l'),('e','l'),('e','o'),
('H','l'),('H','o'),
('e','l'),('e','o'),
('l','l'),('l','o'),
('H','o'),('e','o'),('l','o'),('l','o')]

实现2正确的解法是

splits l = [(take i l, drop i l) | i <- [0 ..length l]]

问题:为什么实现 1 和实现 2 做不同的事情?实现 1 中发生了什么?

最佳答案

关键观察语句是什么x <- list在第一个版本中。让我们看一个稍微不同的例子

[i | i <-[1..3]] => [1,2,3]

String = [Char]一个有

[c | c <- "Word"] => "Word" or equivalently ['W','o','r','d']

这样我们就可以稍微更正您的第一个版本并得到后者

splits l = [(x,y) | i <- [0 ..length l], x <- [take i l], y <- [drop i l]]

但我仍然不得不说这是相当单一的,在我看来更好的解决方案是使用递归函数。

splits :: [a] -> [([a],[a])]
splits xx = splits' [] ([],xx)
where splits' :: [([a],[a])]-> ([a],[a]) -> [([a],[a])]
splits' acc xs@(_,[]) = reverse (xs:acc)
splits' acc (xs,y:ys) = let xs' = (xs++[y],ys)
in splits' (xs':acc) xs'

或高阶函数

splits :: [a] -> [([a],[a])]
splits xx = zipWith splitAt [0..(length xx)] (repeat xx)

关于list - Haskell 列表理解 - 所有列表拆分的列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22594719/

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