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
シード関数とリストを取り、シード関数をリストの最初の要素に適用し、それによって返された関数をリストの 2 番目の要素に適用することによって作成されたリストを返します。
これは機能しますが、これをもう少し便利なことに使用する過程で、自分以外の関数を返す関数が基本単位であることが多くあることに気付きました。そして、自分自身を返す関数を明示的に宣言することは、やや退屈になりつつありました。return
モナドの関数のようなものを使用できるようにしたいのbind
ですが、これらのタイプの関数がどうなるかわかりません。特に、最初に返す関数以外のものとリンクするつもりはなかったので、 .
これを Monad に押し込もうとすると、自分がやっていることが役に立つかどうか心配になり始めたので、要するに、私が知りたいのは:
- 私がしていることは悪いことですか?そうでない場合は、
- 私がやっていることは以前に行われたことがありますか/ここで車輪を再発明していますか? そうでない場合は、
- これを行うためのエレガントな方法はありますか、それとも私はすでにこれに到達しており、ある種の
return
アナログが欲しくて貪欲になっていますか?
(ちなみに、「自分自身を返す関数」または「(関数の) 再帰的なデータ構造」のほかに、この種のパターンが何と呼ばれているのかよくわからず、効果的な研究を行うことを困難にしています。誰でもこのパターンに名前を付けることができます (実際に名前がある場合)。それだけで非常に役立ちます)