繁体   English   中英

如何在Haskell中合并两种不同类型的列表

[英]How to combine two different type of lists in haskell

如何合并两种不同类型的列表并遍历Haskell中的结果?

例如:

input: [1,2,3]  ['A','B','C'],
output: ["A1","A2","A3","B1","B2","B3","C1","C2","C3"].

我尝试使用IntChar进行示例,例如:

combine :: Int -> Char -> String
combine a b = show b ++ show a

但是,这不起作用,因为如果我将此功能用于combine 3 'A' "'A'3" combine 3 'A' ,则输出将为"'A'3" ,而不是"A3"

show :: Char -> String实际上会将单引号引起来:

*Main> show 'A'
"'A'"

但是由于type String = [Char] ,我们可以使用:

combine :: Int -> Char -> String
combine i c = c : show i

因此,在这里我们构造了一个以c为首(第一个字符)的字符列表,并以show i (整数的表示形式)为尾。

现在,我们可以使用列表推导来组合两个列表:

combine_list :: [Int] -> [Char] -> [String]
combine_list is cs = [combine i c | c <- cs, i <- is]

然后生成输出:

*Main> combine_list [1,2,3]  ['A','B','C']
["A1","A2","A3","B1","B2","B3","C1","C2","C3"]

您可以执行以下操作;

combiner :: [Char] -> [Int] -> [String]
combiner cs xs = (:) <$> cs <*> (show <$> xs)

*Main> combiner ['A','B','C'] [1,2,3]
["A1","A2","A3","B1","B2","B3","C1","C2","C3"]

这里(:) <$> cs (其中<$>是infix fmap )将构造一个应用列表函子,而show <$> xs就像map show xs产生["1","2","3"]并按<*>我们仅将应用列表应用于["1","2","3"]生成["A1","A2","A3","B1","B2","B3","C1","C2","C3"]

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM