0

内部再帰ヘルパー関数を使用して関数を記述する必要があることが常にわかります。これは、外部関数と同じパラメーター リストを使用しますが、追加のアキュムレータ引数のみを使用します。

def encode(tree : Tree, text: String):String = {
    def rec(tree: Tree, text:String, result:String):String = ???

    rec(tree, text, "")
} 

これを次のように単純化したい:

def encode(tree : Tree, text: String)(implicit result:String = "" ):String

これは内部関数定義を削除できますが、それには問題があります。lookup内部 encodeで関数を呼び出す必要があるかどうかを確認し、関数への暗黙的なパスlookupである String 型の暗黙的なパラメーターも取ります。 implicit result:String = ""lookup

 def lookup(tree : Tree, text: String)(implicit result:String = "" ):String

これが発生したくないのですが、暗黙のパラメーターlookupがその関数の外部で解決されないように制限する方法はありますか? または他のより良いアイデア?

4

3 に答える 3

2

代わりに通常のデフォルト引数を使用してから、実装でアキュムレータを明示的に渡します。

def encode(tree : Tree, text: String, result : String = "" ): String = {
  //snip
  encode(new_tree, new_text, new_result)
}

// call
encode(my_tree, my_text)
于 2013-05-02T17:36:47.157 に答える
0

あなたのアイデアは素晴らしいですが、そのような一般的なタイプの暗黙的なパラメーターの使用はお勧めできません。暗黙的な定義の競合に遭遇しないようにするためです (たとえばStrings、スコープ内に暗黙的な可視性が多すぎる場合)。

マーティンの著書であるIIRCは、そのような問題について具体的に言及しています。

特定のメソッドごとに型が変わる String の周りに明示的な Wrapper 階層クラスを定義できます。

abstract class Wrapper[A](value: A) { def apply(): A = value }

case class EncodeWrapper[A](value: A) extends Wrapper(value)
case class LookupWrapper[A](value: A) extends Wrapper(value)

def encode(tree : Tree, text: String)(implicit result: EncodeWrapper[String] = EncodeWrapper("") ):String

def lookup(tree : Tree, text: String)(implicit result: LookupWrapper[String] = LoodupWrapper("") ):String

メソッド本体で文字列を「ラップ/ラップ解除」する必要があるという明らかな欠点があります。

これは、ラッパーとメソッド内のラップされた型の間の暗黙的な変換によって軽減できますが、特に非常にコンパクトなヘルパー関数の場合は、まだ少し扱いに​​くいです...

もちろん、メソッドの戻り値の型がより具体的であり、暗黙的な衝突の可能性が非常に低くなると、すべてが簡素化されます。

于 2013-05-02T17:25:03.143 に答える
0

lookupそのシナリオで暗黙的を明示的に提供することを検討しましたか。そのようです:

def encode(tree : Tree, text: String)(implicit result:String = "" ):String = {
  lookup(tree, text)("other string")
}
于 2013-05-02T16:38:02.833 に答える