gpt4 book ai didi

haskell - 两个列表元素的所有非重复组合

转载 作者:行者123 更新时间:2023-12-03 23:03:16 24 4
gpt4 key购买 nike

用一个例子更容易解释这一点:

我想写一个函数 [a] -> [(a,a)] 所以如果我得到一个列表

[A, B, C, D] 

我希望这个列表返回:
[(A, A), (A,B), (A,C), (A,D), (B,B), (B,C), (B,D), (C,C), (C,D), (D,D)]

我想出了这个代码:
function s = [(x,y) | x <- s, y <- s, x<=y]

这适用于整数列表,但我希望它适用于不是 Ord 类实例的数据类型。我的数据类型派生 Show 和 Eq。那么有没有简单的方法来解决这个问题呢?我在想也许通过过滤元组
function s = [(x,y) | x <- s, y <- s]

但我也不知道我怎么能做到这一点。

最佳答案

使用递归的解决方案:

f :: [a] -> [(a, a)]
f [] = []
f (x:xs) = [(x, y) | y <- (x:xs)] ++ f xs

没有递归:
import Data.List (tails) 

f' :: [a] -> [(a, a)]
f' xs = concat [[(head x, y) | y <- x] | x <- tails xs]

没有列表理解:
import Data.List (tails) 

f'' :: [a] -> [(a, a)]
f'' xs = concatMap (\sl -> zip (repeat $ head sl) sl) (tails xs)

最好的是 Daniel Wagner,只需使用
[(head x, y) | x <- tails xs, y <- x]

关于haskell - 两个列表元素的所有非重复组合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54336429/

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