[英]How to deal with recursing through a list in Haskell (transpose operation)
雖然我知道 Haskell 中可能有轉置或 ZipList 函數,但我正在嘗試構建我自己的轉置函數,該函數將采用n個等長m 的列表並將它們轉置為m個長度為n 的列表。
到目前為止,我的功能幾乎可以使用以下代碼:
list = [[1,2,3],[4,5,6],[7,8,9]]
head' (x:xs) = x
head'' [] = []
head'' (xs:lxs) = head' xs:head'' lxs
tail' [] = []
tail' (x:xs) = xs
tail'' [] = []
tail'' (xs:lxs) = tail' xs:tail'' lxs
merge (xs:lxs) = (head' xs:head'' lxs):(merge (tail' xs:tail'' lxs))
當我在 ghci 中運行 > merge list
時,我得到以下輸出:
[[1,4,7],[2,5,8],[3,6,9],[*** Exception: list2.hs:16:1-16: Non-exhaustive patterns in function head'
我很確定這意味着我head'
的空列表的基本情況丟失了。 該列表已轉置,只是未關閉。 在這種情況下我該如何處理這個問題? 我有一種暗示,它可能與Maybe
,但我無法以這種方式實現它。
您需要添加退出條件:
merge [] = []
merge ([]:xss) = merge xss
除了現有的head
和tail
功能之外, map
就是您所需要的。 為簡單起見,這里假設輸入始終是一個非空列表(即, xs
可能是[[],[],[]]
,但絕不是單獨的[]
,因此使用head
或tail
沒有問題。)
> map head list
[1,4,7]
> map tail list
[[2,3],[5,6],[8,9]]
> let foo xs = if null (head xs) then [] else map head xs : foo (map tail xs)
> foo list
[[1,4,7],[2,5,8],[3,6,9]]
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.