我想在一個串列中追加串列,在第二個串列中追加串列。
使用 concat 可以創建一個包含所有元素的串列,而 zip 似乎可以將兩個嵌套的串列合并成一個單一的嵌套串列,而不合并子串列。
let x = [["one"/span>, "two"/span>]。 ["五"/span>, "六"/span>], ["九"/span>, "十"/span>]
let y = [["三"/span>, "四"/span>], ["七"/span>, "八"/span>], ["十一"/span>, "十二"/span>] ]
應該成為
[["one", "wo", "三"/span>, "四"/span>], ["五"/span>, "六"/span>, "七"/span>, "八"/span>], ["九"/span>, "十"/span>, "十一"/span>, "十二"/span>]]
我怎樣才能實作上述結果?我的直覺是使用map,盡管我一直不成功。
uj5u.com熱心網友回復:
在一些語言中,如Scheme map可以接受任何數量的串列,但在Haskell中,二進制的map有自己的名字,zipWith:
zipWith ( ) x y
將做你想做的事。
如何到達那里,在 REPL 上玩耍:
如何到達那里?
> zip x y
[(["one","two"], ["three", "四"]),(["五","六"] 。 ["七"/span>,"八"/span>]),(["九"/span>, "十"/span>],["十一"/span>,"十二"/span>]]
-- BTW這些不是串列,而是圖元。
> zipWith (,) x y --與zip x y相同。
[(["one","two"], ["three", "四"]),(["五","六"] 。 ["七"/span>,"八"/span>]),(["九"/span>, "十"/span>],["十一"/span>,"十二"/span>]]
> zipWith (a b -> (a,b)) x y --與上述相同。
[(["one","two"], ["three", "四"]),(["五","六"] 。 ["七"/span>,"八"/span>]),(["九"/span>, "十"/span>],["十一"/span>,"十二"/span>]]
> zipWith (a b -> [a,b]) x y --與上面的不是一回事。
[[["one","two"],["three"。 "四"/span>]],[["五"/span>,"六"/span>] 。 [["七"/span>,"八"/span>]],[["九"/span>。 "十"/span>],[["十一"/span>,"十二"/span>]]
> zipWith (a b -> concat [a,b]) x y --成功!。
[["一","二","三"。 "四"],["五","六"。 "七"/span>,"八"/span>],["九"/span>。 "十"/span>,"十一"/span>,"十二"/span>]]
> zipWith (a b -> a b) x y --等同于上述。
[["一"/span>,"二"/span>,"三"/span>。 "四"],["五","六"。 "七"/span>,"八"/span>],["九"/span>。 "十"/span>,"十一"/span>,"十二"/span>]]
> zipWith ( ) x y --最后,簡化。
[["一"/span>,"二"/span>,"三"/span>。 "四"],["五","六"。 "七"/span>,"八"/span>],["九"/span>。 "十"/span>,"十一"/span>,"十二"/span>]]
但是你也可以按照你的要求使用map,來處理zip的輸出:
> zip x y
[(["one","two"], ["three", "四"]),(["五","六"] 。 ["七"/span>,"八"/span>]),(["九"/span>, "十"/span>],["十一"/span>,"十二"/span>]]
> map id $ zip x y
[(["one","two"], ["three", "四"]),(["五","六"] 。 ["七"/span>,"八"/span>]),(["九"/span>, "十"/span>],["十一"/span>,"十二"/span>]]
> map ((a,b) -> a b) $ zip x y --與zipWith ( )相同
[["一"/span>,"二"/span>,"三"/span>。 "四"],["五","六"。 "七"/span>,"八"/span>],["九"/span>。 "十"/span>,"十一"/span>,"十二"/span>]]
另一種實作的方法是使用transpose,它本身就是一種zip:
map concat $ transpose [x,y]
這使用了我們在上面看到的兩個串列的相同的concat,現在它將在任何數量的子串列中一起作業,每個串列都來自原件(這里仍然是兩個):
> transpose [x,y] 。
[[["one","two"],["three", "四"/span>]],[["五"/span>,"六"/span>] 。 [["七"/span>,"八"/span>]],[["九"/span>。 "十"/span>],[["十一"/span>,"十二"/span>]]
因此,它可以毫不費力地擴展到處理任何數量的串列:
map concat $ transpose [x,y,z]
等等。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/316932.html
標籤:
