我正在使用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
类似物而变得贪婪?
(顺便说一句,除此之外,“返回自身的函数”或“递归数据结构(函数)”,我不太确定这种模式叫什么,并且很难对其进行有效的研究——如果任何人都可以给我这个模式的名称(如果它确实有一个),仅此一项就非常有帮助)