動詞、副詞、フォークなどを介した超凝縮された暗黙のプログラミングの J スタイルのエミュレーションが、主流の関数型言語のライブラリを介して試みられたことはありますか?
もしそうなら、結果はどのくらい成功しましたか?
そうでない場合、これを不可能にする技術的な問題はありますか?それとも、実行する価値がないだけですか?
私は特に、関数型プログラミングの基本概念に直接対応していないように見えるフォークのような構造に興味があります。
動詞、副詞、フォークなどを介した超凝縮された暗黙のプログラミングの J スタイルのエミュレーションが、主流の関数型言語のライブラリを介して試みられたことはありますか?
もしそうなら、結果はどのくらい成功しましたか?
そうでない場合、これを不可能にする技術的な問題はありますか?それとも、実行する価値がないだけですか?
私は特に、関数型プログラミングの基本概念に直接対応していないように見えるフォークのような構造に興味があります。
暗黙のプログラミングは、Haskell のコンビネータ ロジックまたは無意味なポイントフリー スタイルにかなり密接に対応していませんか? たとえば、私が収集したものから J はわかりませんが、「フォーク」は 3 つの関数f
、g
、およびh
引数x
を式 に変換しますg (f x) (h x)
。「単一の引数に複数の関数を適用し、結果を順番に適用する」という操作は、Curry のSchönfinkel のSコンビネータの一般化であり、HaskellApplicative
では Reader モナドのインスタンスに対応します。
上で指定された結果に一致するfork
Haskellのコンビネータは、 type を持ちます。これを Reader ファンクターを使っていると解釈し、任意のファンクターに書き換えると型は になります。最初の 2 つの引数を入れ替えると、/の型である が得られます。fork f g h x
(t -> a) -> (a -> b -> c) -> (t -> b) -> t -> c
((->) t)
f a -> (a -> b -> c) -> f b -> f c
(a -> b -> c) -> f a -> f b -> f c
liftA2
liftM2
したがって、平均を計算する一般的な例として、フォークはとして+/ % #
直接変換できます。flip liftA2 sum (/) (fromIntegral . length)
Applicative
(/) <$> sum <*> fromIntegral . length
そうでない場合、これを不可能にする技術的な問題はありますか?それとも、実行する価値がないだけですか?
少なくとも Haskell では、主な問題は、特に Reader モナドを使用して引数を分割する場合に、非常にポイントフリーなスタイルが難読化されて読めないと見なされることだと思います。
カムカンの議論はかなり良いです。ただし、このスタイルでは 2 つのトラバーサルが発生することに注意してください。
トラバーサルをマージするコンビネータ ライブラリを作成できます。こちらをご覧ください: http://squing.blogspot.com/2008/11/beautiful-folding.html
この投稿では、平均を書くための次の例を提供しています。
meanF :: Fractional a => Fold a a
meanF = bothWith (/) sumF (after lengthF fromIntegral)
mean :: Fractional a => [a] -> a
mean = cfoldl' meanF
また、Conal Eliott のフォローアップ投稿では、これをさらに一般化しています: http://conal.net/blog/posts/enhancing-a-zip/
彼は自分の投稿からコードをハックで利用可能なライブラリに引っ張ってきました: http://hackage.haskell.org/package/ZipFold