【发布时间】:2014-12-10 21:19:03
【问题描述】:
我做字符串混合:
main = do
first <- getLine
second <- getLine
print (zip first second)
结果:[('a','1'),('b','2'),('c','3')]。
但是我如何将结果连接到a1b2c3?
【问题讨论】:
标签: haskell
我做字符串混合:
main = do
first <- getLine
second <- getLine
print (zip first second)
结果:[('a','1'),('b','2'),('c','3')]。
但是我如何将结果连接到a1b2c3?
【问题讨论】:
标签: haskell
你必须做以下操作:
1) 将列表中的元组转换为单个字符串,可由单个map 执行。
2) 连接整个列表
Prelude> let a = [('a','1'),('b','2'),('c','3')]
Prelude> let b = map (\(x,y) -> x : [y]) a
Prelude> b
["a1","b2","c3"]
Prelude> concat b
"a1b2c3"
Prelude> Prelude.foldl1' (++) b -- instead of concat you can do fold
"a1b2c3"
【讨论】:
你也可以在一个方便的行中做到这一点
let a = [('a','1'),('b','2'),('c','3')]
uncurry ((. return) . (:)) =<< a
【讨论】:
如果我可以添加另一个(不必要的)答案,只是为了展示 Haskell 让您思考和解决问题的方式有多少(疯狂):)
Prelude Data.List> let input = [('a','1'),('b','2'),('c','3')]
Prelude Data.List> let (l1,l2) = unzip input
Prelude Data.List> let alt_stream s1 s2 = head s1:head s2:alt_stream (tail s1) (tail s2)
Prelude Data.List> take (length l1 * 2) $ alt_stream (cycle l1) (cycle l2)
"a1b2c3"
【讨论】: