1

無限の数のリストを生成しようとしています

0,1,-2,3,-4,5,-6...

これまでのところ私は得た

evenise x   | x == 0 = 0
            | even x = -x
            | otherwise = x

s = foldl (\x -> evenise x) 0 [1..]

しかし、私はエラーが発生しています

Occurs check: cannot construct the infinite type: a0 = b0 -> a0
In the first argument of `evenise', namely `x'
In the expression: evenise x
In the first argument of `foldl', namely `(\ x -> evenise x)'

要素を取り込んでいるのでエラーがわかりませんしevenise、匿名関数(\x -> evenise x)も単一の要素を取り込んでいます。

4

3 に答える 3

4

使いたくmapないfoldl

s = map evenise [0..]

mapリストを調べて、マップされた関数を各要素に適用します。 foldlリストを値に「縮小」するために使用されます。たとえば、リスト内のすべての要素を追加するには、次のように実行できます。

foldl (+) 0

また、foldl有限リストでのみ機能しますが、foldr(削減のためにも)無限リストで機能する場合もあります。

于 2012-11-25T09:40:45.143 に答える
3

無限のリストを作成し、テストをリスト定義に埋め込むこともできます。

s = [ if odd x then x else negate x | x <- [0,1..] ]
于 2012-11-25T10:53:46.890 に答える
3

1つではなく2つの引数foldlの関数をとるため、エラーが発生します。しかし、とにかく無限のリストを処理することはできないので、あなたがそこで何をしようとしているのかわかりません。foldl

evenise( -0 == 0であるため、最初の行は必要ありません。 )

于 2012-11-25T09:43:11.847 に答える