6

私はハスケルの関数でアンカリー化と $ の適用について学んできましたが、カリー化されていない関数をより神秘的なものに変換する際にまだ問題があります。

私が与えられた機能は

apple = map $ uncurry $ flip ($)

これはタプルのリストを取り、タプル内の対応する関数に内部の変数に適用されることに気付きました。だから私はそれを次のように書き直そうとしています

apple ls = foldr function _ ls
    where function (a,b) c = (uncurry b) (a,c)

_ のエラーが解析エラーとして表示され、どの開始点を使用すればよいかわかりません。私はこのポリモーフィックを作成する必要がありますが、これが謎を少なくする方法ではない可能性が最も高いことを認識しています. 何か案は?彼らは大歓迎です

4

2 に答える 2

7

Appleにはタイプがあります

apple :: [(a, a->b)] -> [b]

次のように書き換えることができます。

apple ls = map (\(a, f) -> f a) ls

したがって、これを で書くことfoldrは非常に実行可能です。

apple ls = foldr (\(a, f) rest -> f a : rest) [] ls

または、これをポイントフリーに書き換えることができます

apple = foldr ( (:) . (uncurry . flip $ ($)) ) []

解析エラーの理由は、_「気にしない変数」の特別な構文です。これにより、次のようなものを書くことができます

 foo _ _ _ _ a = a

また、変数の繰り返しに関するエラーは発生しません。基本的に_、最初の空のリストを入力して修正し、 に適用しようとするのではなく、functionに追加するようにしました。ca

これを可能な限り明確に書きたい場合は、元の

apple = map . uncurry . flip $ ($)

かなりいいです。

于 2013-10-24T01:05:55.970 に答える