私は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番目の要素に適用するなどして作成されたリストを返します。
しかしこれをやや便利なものに使う過程で、私は基本単位が自分自身以外の関数を返す関数であることに気付きました。明示的に自分自身を返す関数を宣言することはやや面倒になっていた。私はむしろMonadのreturn
関数のようなものを使うことができるだろうが、bind
がこれらの型の関数に対して何をするのか分からない。最初の場所。モナドにこれを押し込もしようとすると
は私が何をやっていたかどうかについて教えて心配始めに便利だったので、簡単に言えば、私が知りたいことは次のとおりです。
- は私がやっているです悪いこと?もしそうでなければ、
- 私は前にやったことがありますか?私はここで車輪を再発明していますか?そうでない場合は
- これを行うにはエレガントな方法がありますか、すでに私はこれに達しており、
return
アナログを欲しいと貪欲にしていますか?
(ちなみに、ほかに、「themeselvesを返す関数」または「機能の再帰的なデータ構造()」、私はこの種のパターンが呼び出され、かつ効果的な研究をやろうとしてきたものを、非常にわからないんだけどそれは難しい - もし誰かが私にこのパターンの名前を与えることができれば(実際にそれがあれば)、それだけで非常に役に立ちます)
これはかなり興味深いようです - 私は間違いなくCircuitsについて詳しく読む予定です。 – Anachrome