2011-04-08 40 views
11

我對Haskell很新,我有一個簡單的問題。Haskell中的'重複'?

我可以使用什麼函數與a和b會導致a,b次。

例子:
a = 4 | b = 3
將返回:
[4, 4, 4]

謝謝!

+1

Hoogle一如既往是你的朋友:狀態您想要找到的函數:'Integral b => a - > b - > [a]',它會告訴您答案:http://www.haskell.org/hoogle/?hoogle=Integral+ b +%3D%3E + a + - %3E + b + - %3E + [a] – stusmith 2011-04-11 10:39:36

回答

29

replicate

replicate 3 4 

將是:

[4,4,4] 

當你知道什麼是你需要的功能的類型(在這種情況下,它是很明顯的功能,您需要有一個類似於Int -> a -> [a]的類型),您可以使用Hoogle來找到它。

+6

爲了獲得*精確*行爲Peter描述了使用:'flip replicate 4 3' – dbyrne 2011-04-08 13:44:37

3

當然peoro是對的,你應該使用replicate

然而,對於這樣的任務很常見的模式是從它(使用taketakeWhile)來構造一個無限列表,並採取你需要儘可能多的:

rep a b = take b $ repeat a 

另一個(超過實際教育)的方法是使用正確長度的列表,所有元素的地圖:

rep a b = map (const a) [1..b] 

一種非常低效的,但有趣的版本是

rep a b = until ((b==).length) (a:) [] 
6

您也可以使用遞歸(雖然上述方案中應首選當然):

rep a 0 = [] 
rep a b = a : rep a (b-1) 
2

..或者乾脆類似的東西

> take 3 [4,4..] 
> [4,4,4]