在 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]
这与上面的类似,但在其实现中使用了展开器并且是非递归的。
我已经尝试了一段时间来解决上面的问题,但我仍然可以做到(在 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
为真,则返回空列表。否则,h x
用作头部并将展开器的结果附加为尾部。Unfoldr 将一个列表作为头部和尾部(x:xs)
进行递归。x
xs
p/s:我可能这样做非常非常错误。