簡體   English   中英

如何在 Haskell 中通過列表處理遞歸(轉置操作)

[英]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

除了現有的headtail功能之外, map就是您所需要的。 為簡單起見,這里假設輸入始終是一個非空列表(即, xs可能是[[],[],[]] ,但絕不是單獨的[] ,因此使用headtail沒有問題。)

> 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM