Haskell を学び、より関数的な方法で考える方法を学ぶことにしたので、このパラダイムで適切なアプローチを使用しようとする非常に単純な演習を解決しようとしています。
私はHaskellでこの簡単な演習を達成しようとしています:
Input: [2, 4, 1, 1, 2]
Output: [True, True, False, False, False, False, True, False, True, True]
したがって、リスト内の要素はInput
リストFalse
内に
Output
収まり、奇数の要素はTrue
;になります。Input
それぞれ、リストの値が示す回数だけ繰り返されます。
Input
リストをトラバースし、 i ᵗʰ アイテムがペアの位置にある場合は、出力にTrue
i回 to を追加しますOutput
。i ᵗʰ アイテムが奇数の位置にある場合
、リストにFalse
i回追加しますOutput
。
これは非常に単純な問題のように見えますが、実際にそうです。しかし、関数型プログラミングのバックグラウンドがない私には、Haskell でそれを表現する方法がわかりません。
リスト内包表記内で λ 関数を使用して、現在のインデックスを追跡しようとしました。
row :: [Integer] -> [Bool]
row xs = [ (last $ zipWith (\i x -> x) [1..] [0..i]) `mod` 2 == 0
| j <- xs, i <- [0..j-1] ]
しかし、私はその動作を理解していないのでfindIndices
、簡単な代替手段として使用を終了しました:
row :: [Integer] -> [Bool]
row xs = [ (head $ findIndices (==j) (xs)) `mod` 2 == 0
| j <- xs, i <- [0..j-1] ]
この最後のアプローチを使用すると、問題ないようです。
> let xs = [ 1, 4, 3, 2 ]
> print $ row xs
[True,False,False,False,False,True,True,True,False,False]
しかし、アイテムは必ずしも一意ではないため、問題は解決されていません。
> let xs = [ 2, 2, 4, 3]
> print $ row xs
[True,True,True,True,True,True,True,True,False,False,False]
head findIndices
最初の出現のみを与えるためです。(私が思うに、うまくいったとしても、それはこの問題を解決するための非常に効率的な方法ではありません。)
Haskellyの方法で探している結果を得るにはどうすればよいですか?