List 两个不同类型列表的笛卡尔乘积(Haskell)

List 两个不同类型列表的笛卡尔乘积(Haskell),list,haskell,cartesian-product,List,Haskell,Cartesian Product,我(非常)不熟悉Haskell,我正在尝试解决我认为很简单的问题: 我想创建两个不同类型列表的笛卡尔乘积列表:例如,一个包含字符,另一个包含整数 ['A','B','C'] 无限列表: [1..] 我试图得到一个输出,其中我的每个字母都有一个数字后缀:例如 ["A1", "B1", "C1", "A2", "B2"..] 我一直在尝试使用我在网上读到的东西,但是我很挣扎。据我所知,我想使用“show”将整数列表转换为字符串。我的代码如下: combinatio

我(非常)不熟悉Haskell,我正在尝试解决我认为很简单的问题:

我想创建两个不同类型列表的笛卡尔乘积列表:例如,一个包含字符,另一个包含整数

   ['A','B','C']
无限列表:

    [1..]
我试图得到一个输出,其中我的每个字母都有一个数字后缀:例如

    ["A1", "B1", "C1", "A2", "B2"..]
我一直在尝试使用我在网上读到的东西,但是我很挣扎。据我所知,我想使用“show”将整数列表转换为字符串。我的代码如下:

    combinations xs cs = (,) <$> xs (show <$> cs)
我真的很感激任何想法,因为我已经挣扎了一段时间

谢谢

就你而言

f = (,)
a = xs
b = show <$> cs
注意:我回到
(,)
来强调一下:

Prelude> take 5 $ (,) <$> (show <$> cs) <*> xs
[("1",'A'),("1",'B'),("1",'C'),("2",'A'),("2",'B')]

这肯定会产生一个对列表,而不是一个串联字符串列表?我现在无法测试,但我认为应该使用
(:)
而不是
(,)
男孩,我错过了这个问题的很多微妙之处,不是吗@hskjskj如果恰好有一个列表是无限的,您仍然可以通过将它放在第一位,然后重新排序函数的参数来说明这一点来取得进展。@hskjskj在本例中,正如amalloy所指出的,将无限列表放在第一位会有所帮助。两个列表都是无限的一般情况更为棘手,因为您需要仔细列举所有情况,以免过于关注其中的无限适当部分(如
A1、A2、A3、
序列)。对于处理该问题,一些软件包会有所帮助(例如
Omega
monad),但我建议您在对Haskell非常熟悉之前不要使用这些软件包。谢谢您的编辑。这对无限的内部循环来说很有意义!
(,) <$> (xs (show <$> cs))
f <$> a <*> b
f = (,)
a = xs
b = show <$> cs
(,) <$> xs <*> (show <$> cs)
(,) <$> (show <$> cs) <*> xs
Prelude> take 5 $ (,) <$> (show <$> cs) <*> xs
[("1",'A'),("1",'B'),("1",'C'),("2",'A'),("2",'B')]
Prelude> take 5 $ (flip (:)) <$> (show <$> cs) <*> xs
["A1","B1","C1","A2","B2"]