我正在使用Haskell实现一个涉及返回值和它们本身(或相同类型的函数)的模式。目前,我的实现方式如下:
newtype R a = R (a , a -> R a)
-- some toy functions to demonstrate
alpha :: String -> R String
alpha str
| str == reverse str = R (str , omega)
| otherwise = R (reverse str , alpha)
omega :: String -> R String
omega (s:t:r)
| s == t = R (s:t:r , alpha)
| otherwise = R (s:s:t:r , omega)
这些函数的驱动力是一个叫做级联的函数:
cascade :: (a -> R a) -> [a] -> [a]
cascade _ [] = []
cascade f (l:ls) = el : cascade g ls where
R (el , g) = f l
这是一个接受种子函数和列表的函数,返回通过将种子函数应用于列表的第一个元素,将该函数返回到列表的第二个元素等等创建的列表。
这个方法是有效的,但在使用它进行更有用的事情时,我注意到很多时候我拥有的基本单元是返回其他函数而不是自己的函数;显式声明一个函数返回自身变得有些乏味。我更愿意能够使用像Monad的“return”函数之类的东西,但是,我不知道对于这些类型的函数,“bind”会做什么,特别是因为我从未打算将它们与除了它们最初返回的函数之外的任何东西链接起来。
试图将此强行塞入Monad中开始让我担心我所做的是否有用,因此,简而言之,我想知道:
- 我所做的是件坏事吗?如果不是, - 我所做的事情以前已经完成/我正在重新发明轮子吗?如果不是, - 是否有一种优雅的方法来做这个,或者我已经达到了这个目标,只是贪心地想要某种“return”模拟?
(顺便说一下,除了“返回主题自己”或“递归数据结构(函数)”,我不太确定这种模式叫什么,这使得在其中进行有效研究变得困难——如果有人能为我给出这种模式的名称(如果它确实有一个),那就非常有帮助了)