8

これは「できないし、とにかくする理由がない」に該当するかもしれませんが、それが可能かどうか興味があります。少なくとも、楽しい R パズルになるかもしれません。

cat常に追加するようにカリー化することを考えてい\nました。ただし、cat与えられた数の引数を ( 経由で) 貼り付けるように記述されています...

驚くべきことに、これは機能します:

> library(functional)
> catnip <- Curry( cat, "\n" )
> catnip("hi")

 hi

ただし、\nはユーザーのテキストの前に巻き上げられます。カリー化された引数が常に引数を終了するように指定するように関数をカリー化する方法はあり...ますか?

4

2 に答える 2

10

Curry()あなたが望むものとは逆の順序で2つの引数リストをかなり効果的に配線しているように見えます。ただし、これは十分に単純な関数であり、そのミラー イメージを作成して代わりに使用することができます。

Curry2 <- function(FUN, ...) {
    .orig = list(...)
    function(...) do.call(FUN, c(list(...), .orig))
}

catnip <- Curry2( cat, "\n" )
catnip("hi")
于 2012-06-27T18:25:21.693 に答える
7

#1。Curry の 2 番目の引数を無視し、改行をハード コードします。

の最後の引数をcat無名関数にハードコーディングしてカリー化するこれを試してください。Curry最初の引数以降は、実際には引数を使用しません。

catnip <- Curry(function(...) cat(..., "\n") )

#2。無名関数をカリー化して関数を作成する

catの引数を並べ替える無名関数を使用して、 の最後の引数をカリー化する 2 番目のソリューションを次に示しcatます。

catnip2 <- Curry(function(last.arg, ...) cat(..., last.arg), "\n")

# test
catnip2("hi", "there")

#3。さらに基本的な関数をカリー化して目的の関数を作成する

おそらく、これらすべての本当のポイントは、基本的なコンポーネントを取得して、それらをカリー化して、必要なものを取得する方法を確認することです。したがって、一般的なものを定義してlast.arg.funから、そのカレーによって目的の関数を作成できます。

last.arg.fun <- function(FUN, last.arg, ...) FUN(..., last.arg)
catnip3 <- Curry(last.arg.fun, cat, "\n")

# test
last.arg.fun(cat, "\n", "hi", "there")

# test
catnip3("hi", "there")

last.arg.catある時点で必要な場合は、次の 2 つの手順で行うことができます。

last.arg.cat <- Curry(last.arg.fun, cat)
catnip4 <- Curry(last.arg.cat, "\n")

# test
last.arg.cat("\n", "hi", "there")

# test
catnip4("hi", "there")

各テストでは、hi there が改行で終わるという行が生成されることに注意してください。

編集:より多くのソリューション。

于 2012-06-27T18:31:28.657 に答える