何度か、リストをトラバースして、リスト内の次の要素などにも依存するプロパティを持つ要素を選択したいと思っていました。f
簡単な例として、指定された間隔で関数が符号を変更する回数をカウントするコードがあります[a,b]
。これは、Cのような命令型言語ではかなり明白です。
for(double x=a; x<=b; x+=(b-a)/n){
s*f(x)>0 ? : printf("%e %e\n",x, f(x)), s=sgn(f(x));
}
Haskellでの私の最初の本能は、リストをテールで圧縮してから、フィルターを適用して要素を抽出することfst
でした。しかし、それは不器用で非効率的であるように思われるので、私はそれを折り畳みにした。
signChanges f a b n = tail $
foldl (\(x:xs) y -> if (f x*f y)<0 then y:x:xs else x:xs) [a] [a,a+(b-a)/n..b]
いずれにせよ、これを行うための「正しい」方法があり(Haskellによくあるように)、それが何であるかわからない(または単に気付いていない)と感じます。これをより慣用的またはエレガントな方法で表現する方法についての助けは、一般的に、物事を行うための「正しい」方法を見つける方法についてのアドバイスと同様に、非常に高く評価されます。