2011-08-29 3 views
5

Scalaではf(g(h)(x)))をより少ないカッコで書くことができますか?

ls map (_ + 1) sum 

のような式は、左から右にネストされていないので素敵です。しかし、問題の関数がクラス外で定義されていれば、あまり意味がありません。

次の an example

final class DoublePlus(val self: Double) { 
    def hypot(x: Double) = sqrt(self*self + x*x) 
} 

implicit def doubleToDoublePlus(x: Double) = 
    new DoublePlus(x) 

  1. 1つの方法の多くの入力方法

この2つの問題を解決する秘訣はありますか?

+0

ユーティリティオブジェクト内のhypotを定義してから、 'hypot(3,4)'として使用するのはどうですか?ここで最高の選択肢のようです。 – IttayD

答えて

12

あなたは関数オブジェクトにandThenを呼び出すことができます。

(h andThen g andThen f)(x) 

あなたは直接かかわら方法でそれを呼び出すことはできませんので、多分あなたのhニーズを部分的に適用される関数にメソッドを変換するために(h _)になること。 andThenメソッドがFunctionパラメータを受け入れるため、コンパイラは後続のメソッド名を自動的に関数に変換します。

また、このような何かを書くことpipe operator|>を使用することができます時に、いくつかの(あなたがdoubleToDoublePlusでやったことある)暗黙の型変換と既存のクラス/インタフェースの充実

x |> h |> g |> f 
+0

ニース!私のお気に入りはパイプです。 – Owen

2

は、すべてのAPIの設計についてですクラスはあなたのコントロール下にありません。私はちょうどいくつかのキーストロークを保存するか、かっこを少し減らすために軽く行うことをお勧めしません。したがって、val h = d hypot xと入力できるようにすることが重要な場合は、余分なキーストロークを考慮する必要はありません。 (オブジェクトの割り当てに関する懸念があるかもしれませんが、それは異なります)。

タイトルとあなたの例

も一致していない:F、G、Hは 機能がはなく デフオブジェクトであれば、あなたの懸念がカッコまたは程度であれば

f(g(h(x)))f _ compose g _ compose h _ apply xように書き換えることができます。

しかし、ls map (_ + 1) sumは、あなたが言うようにネストされた呼び出しではないので、タイトルとの関連性はわかりません。ライブラリ/言語の設計者は、使いやすくするために多くの努力をしましたが、フードの下は単純ではありません(hypotの例よりはるかに複雑です)。

+0

まあ、彼らはある意味ではネストされた呼び出しです:各ステップの結果は、次の呼び出しに対する 'this'引数になります。他の言語では、このネストは明白です。私の問題は、特定の引数が 'this'引数であるかどうかは機能的にあまり重要ではありませんが、それはあなたが素敵な呼び出し構文を得るということだけです。 – Owen

2
def fgh (n: N) = f(g(h(n))) 
val m = fgh (n) 
0

たぶんこの、提供される方法観察:

をDEF [A、B、C]構成(F:B => C、G:A => B):A => C = (a:A)=> f(g(a))

上記の答えは基本的に希望の機能を中間のものに組み合わせて、マップで簡単に使うことができます。

関連する問題