単純な関数構成のための「do表記法」の構文糖衣はありますか?
(つまり(.) :: (b -> c) -> (a -> b) -> a -> c
)
いくつかのコンポジションの結果を後で保存できるようにしたいと思います (チェーンを継続しながら.
可能であれば、RebindableSyntax 拡張機能は使用したくありません。
私はこのようなものを探しています:
composed :: [String] -> [String]
composed = do
fmap (++ "!!!")
maxLength <- maximum . fmap length
filter ((== maxLength) . length)
composed ["alice", "bob", "david"]
-- outputs: ["alice!!!", "david!!!"]
以前の関数の結果は本質的に maxLength のバインドを「通過」する必要があるため、このようなことが可能かどうかはわかりませんが、他の同様の表現力のあるオプションについては聞いてみましょう。基本的には、構成を進めながら情報を収集し、後で使用できるようにする必要があります。
おそらく私は状態モナドでこのようなことをすることができますか?
ご協力いただきありがとうございます!
編集
この種のことはちょっとうまくいきます:
split :: (a -> b) -> (b -> a -> c) -> a -> c
split ab bac a = bac (ab a) a
composed :: [String] -> [String]
composed = do
fmap (++ "!!!")
split
(maximum . fmap length)
(\maxLength -> (filter ((== maxLength) . length)))