2016-08-25 140 views
0

的打印元素我有一個列表 let a = [1,2,3,4]哈斯克爾:列表

我希望每次提取2元進行計算。誰能告訴我這是如何實現的?我是Haskell的新手。我知道take 2 a。但是我怎麼能把它放在一個循環中,以便一次提取2個元素。我很困惑。

+4

看一看的['splitAt'](https://hackage.haskell.org/package/base-4.9.0.0/docs/Prelude.html#v:splitAt)函數或['chunksOf '](https://hackage.haskell.org/package/split-0.2.3.1/docs/Data-List-Split.html#v:chunksOf) – ErikR

+0

謝謝..但是,那麼我應該怎樣循環元組來執行計算? –

+1

遞歸。 –

回答

4

您可以編寫自己的遞歸函數和模式匹配您感興趣的元素:

f (a:b:list) = doSomeThingWith a b : f list 

確保正確匹配[][a]箱子。

5

下面是一個例子。您是(或者應當)熟悉map功能:

map :: (a -> b) -> [a] -> [b] 
map f [] = [] 
map f (x:xs) = f x : map f xs 

在這裏,你可能有一個函數,它參數,並希望將其從名單同時適用於兩個元素。這是一個函數mapTwo,其行爲如同map,但具有雙參數函數。爲了簡單起見,我們假設列表中包含偶數個元素。

mapTwo :: (a -> a -> b) -> [a] -> [b] 
mapTwo f [] = [] 
mapTwo f (x1:x2:xs) = f x1 x2 : mapTwo f xs 
+1

不應該是'mapTwo [x] =錯誤「不允許單身人士列表」的情況嗎? – epsilonhalbe

+2

看到我的最後一句話。我只是不想進入如何處理一個奇數值的列表。 – chepner

+1

相反,我不想提出部分函數的優點和缺點,使用'Maybe'或'Either',引發錯誤或使用異常monad。 – chepner