簡體   English   中英

Haskell列表中的列表

[英]Haskell Lists in List

我是Haskell的新手,我正在嘗試以下操作:從[[1,2,3],[4,5,6]]獲得[1,2,3] [[1,2,3],[4,5,6]]嗎?

example :: [[a]] -> [a]
example [] = []
example [x:xs] = [x]

當輸入為[[1,2,3]]且如果我在主列表中添加另一個元素,例如[[1,2,3],[3,4,5]]時,此示例返回[1]我有一個非窮盡模式功能。

你很親密 實際上,您在這里想要的是某種“安全”的頭。

列表[a]具有兩個構造函數:

  1. 空列表[] ,您將在第一種情況下解決此問題;
  2. “ cons” (x:xs)

在第二種情況下,您似乎已將其覆蓋,但實際上您沒有:將圖案放在括號中。 結果,Haskell將您的模式解釋為[(x:xs)] 因此,它認為您匹配一個單例列表(一個具有一個元素的列表),並且x是子列表的開頭,而xs是子列表的結尾。

實際上,您想覆蓋(x:xs) 如果我們使用此模式,則還有另一個問題: x是列表的開頭,因此類型為[a] 因此,我們應該返回x而不是[x] ,因為在后一種情況下,我們會將子列表包裝回列表中。

因此正確的功能是:

example :: [[a]] -> [a]
example [] = []
example (x:_) = x  -- round brackets, x instead of [x]

請注意,由於我們對這里的尾部不感興趣,因此我們使用下划線_ 如果您編譯所有警告( -Wall或更具體的-Wunused-matches ),則Haskell會抱怨您聲明了一個不使用的變量。

泛化為safeHead函數

我們可以將其概括為某種通用的safeHead :: b -> (a -> b) -> [a] -> b函數:

safeHead :: b -> (a -> b) -> [a] -> b
safeHead d _ [] = d
safeHead _ f (x:_) = f x

因此,這里我們將三個參數傳遞給safeHead :一個值(類型b ),如果列表為空,則應返回該值; 一個對頭部進行后處理的函數(鍵入a -> b )以及要process的列表。 在這種情況下,該example等效於:

example :: [[a]] -> [a]
example = safeHead [] id

但是我們也可以在這里返回Maybe [a]

example2 :: [a] -> Maybe a
example2 = safeHead Nothing Just

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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