Programming in Haskell で、Graham Hutton はリストの展開を次のように定義しています。
unfold :: (b -> Bool ) -> (b -> a) -> (b -> b) -> b -> [a]
unfold p h t x | p x = []
| otherwise = h x : unfold p h t (t x)
関数を定義する
• listUnfold :: (b -> Bool) -> (b -> a) -> (b -> b) -> b -> [a]
これは上記のものと似ていますが、実装に unfoldr を使用し、再帰的ではありません。
上記の質問を解決するためにしばらく試してみましたが、まだ解決できます (Haskell および関数型プログラミング全般ではかなり新しいものです)。
私の試み:
listUnfold :: (b -> Bool) -> (b -> a) -> (b -> b) -> b -> [a]
listUnfold f h t x
| f x == True = []
| otherwise = h x :
listUnfoldr (\x -> if f x then Nothing else Just ((h x), (t x))) x
英語でf x
は、true の場合、空のリストを返します。それ以外の場合はh x
、先頭として使用し、unfoldr の結果を末尾として追加します。Unfoldr は、先頭および末尾として(x:xs)
自身を再帰する必要があるリストを取ります。x
xs
p/s: 私はおそらくこれを非常に間違ってやっています。