2

私は一連の数字を持っています:0、1、3、6、10、15、...基本的に、1を追加し、次に2を追加し、次に3を追加します。

この一連の数値をリスト内の指定された数値nまで返す関数を作成する必要があります。foldlを使いたい。

したがって、シリーズ5は[0、1、3、6、10、15]を返す必要があります

これが私がこれまでに持っているものです:

eachElem n = foldl (+) 0 [0..n]

series n = [x | x <- [(eachElem 0), (eachElem 1)..(eachElem n)]]

基本的に、リスト内の各要素はfoldl操作であると考えたので、これを実現するために個別のヘルパー関数(eachElem)を作成しました。

しかし、それは私が望むものよりはるかに大きなリストを返しています。

例えば。シリーズ3=>[0,1,2,3,4,5,6]実際に[0,1,3,6]を返す必要がある場合

これがなぜであるかについて何か考えはありますか?

4

7 に答える 7

7

scanlあなたがしていることにもっと適しています。

その型はscanl :: (a -> b -> a) -> a -> [b] -> [a]-型シグネチャはfoldl'sと同じですが、最終結果だけでなく、増分値のリストを返します。

これは宿題のように見えるので、残りは演習として残しておきます。幸運を!

于 2012-09-25T04:23:21.437 に答える
2

あなたが使用することに固執しているなら、あなたは次のようなことをするfoldlことができます

series n  = reverse $ foldl f [0] [1..n]
    where f xs@(x:_) y = x+y:xs

ghciで

> series 5
[0,1,3,6,10,15]

ただし、問題foldlは、無限級数を作成できないことです。

あなたは次のような無限のシリーズを持つことができます

series = 0:zipWith (+) series [1..]

その後、あなたは次のようなことをすることができます

> take (5+1) series
[0,1,3,6,10,15]

私は試していませんがunfoldr、リストを作成するためにまたは同様の概念を使用することもできます。

于 2012-09-25T05:27:17.290 に答える
1

ここではscanlが最適ですが、foldを使用する必要がある場合は、これを試してください


testso :: Integral a => a -> [a]
testso n = reverse $ foldl (\acc x -> head acc + x:acc ) [0] [1,2..n] 

testso10[0,1,3,6,10,15,21,28,36,45,55]として出力を提供します。

于 2012-09-25T08:13:00.847 に答える
0

あなたの定義seriesは間違っています。

[(eachElem 0), (eachElem 1)..(eachElem n)][0, 1, eachElem n]、実際にはまでのすべての数になりeachElem nます。

あなたは実際にこれをしたいです:

series n = [eachElem x | x <- [0..n]]
于 2012-09-25T05:27:37.803 に答える
0

[a、b..c]と書くと、aは最初の要素、cは最後の要素、bはステップです。これはリスト内のすべての要素間の間隔であり、省略した場合はデフォルトで1になります。 。

それでは、コードを見てみましょう。

  [x | x <- [(eachElem 0), (eachElem 1)..(eachElem n)]] 
  • リスト内包表記では、xは最初に値(eachElem 0)=0を取ります
  • 次に、次の要素は(eachElem 0)+(eachElem 1)=1になります
  • その場合、値が<=(eachElem n)である限り、i番目の要素は(eachElem 0)+ i *(eachElem 1-eachElem 0)になります。

したがって、結果:[0,1 ..(eachElem n)]は、[0,1,2,3 ...を生成し、明らかに期待したものではありません。

amindfvによって提案されているように、scanlを確認する必要があります。

于 2012-09-25T04:35:36.663 に答える
0

定義

series n = [ x | x <- [(eachElem 0)..(eachElem n)]]

間違っている!

例えば:

のため

eachElem 0 -> 0
eachElem 3 -> 6

シリーズ3は次のように評価されます

series 3 -> [(eachElem 0)..(eachElem 3)] -> [0..6] -> [0,1,2,3,4,5,6]

あなたはそのようなものが必要です

series' n = [ eachElem x | x <- [0..n]]

テスト:

> let series' n = [ eachElem x | x <- [0..n]]
> let series n = [ x | x <- [(eachElem 0)..(eachElem n)]]

> series' 3
> [0,1,3,6]

> series 3
> [0,1,2,3,4,5,6]

> eachElem 0
> 0

> eachElem 3
> 6
于 2012-09-25T13:28:43.213 に答える
0

あなたはごまかすことができます:-)

series x = foldl (\xs n -> (n*(n+1) `div` 2):xs) [] [x,(x-1)..0]
于 2012-09-26T09:33:25.463 に答える