2016-03-05 45 views
1

我是Haskell中的新成員,我有一個練習。理論上我知道我應該怎麼做,但我不知道我該如何在Haskell中做到這一點。我的練習是創建一個列表生成器,生成以下無限列表:[1,-1,3,-3,5,-5..]。我想用兩種不同的順序來做。我如何可以將兩個序列與Haskell中的列表生成器組合在一起

有什麼辦法來解決這個問題,這樣的事情:

[ something [a,b,a,b..] | a<-[1,3..], b<-[-1,-3..] ] 

我已經試圖尋找解決方案,但我找不到任何有關列表生成。

+0

這是可以做到這樣的事情,但有一個更簡單的方法:不是單獨列舉正數和負數,而只列舉正數,但同時得出數字和負數。 – leftaroundabout

+0

我覺得'[(2 * a + 1)* b | a < - [0 ..],b < - [1,-1]]'將完成這項工作。 –

回答

4

我給你一個提示。

形式的清單發生器:

[f x y | x <- xs, y <- ys] 

將執行笛卡爾乘積列表xsys(當然,它將應用f到產品的各要素)的。假設xs = [1,2,3]ys = ['a', 'b']上述列表理解等效於:

[f 1 'a', f 1 'b', f 2 'a', f 2 'b', f 3 'a', f 3 'b'] 

因此對於xs的整個ys被遍歷的,從而產生所有f x y0f x y1,...,f x yN值中的每個元件x

問自己:

  • ys是無限的會發生什麼?
  • 因此,您的方法在任何情況下都適用於該結構?
  • 你能想到其他技術產生1-1,然後3-3哪些不需要兩個無限列表,但只有一個無限列表?

現在儘量自己去回答這些問題,因爲如果不是爲了實際行使自己的想法,沒有必要做練習。我將提供在擾流板報價的答案,這樣,如果你放棄了,你可以有可能的解決方案:

[x*y | x <- [1, 3..], y <- [1,-1]]

+0

謝謝,你幫了我很多,對於遲到的答案感到抱歉。 – Tessa

相關問題