2016-11-28 9 views
0

単純化のため、ここではすべての型を削除し、単純なリストを使用しています。私は、コレクションと関数の2つのパラメータをとり、これを使って新しいコレクションを生成する関数があるとします。Scalaは既存の型で実行する関数を作成します

私は知っています!これは地図を再発明するように見えますが、実際のユースケースははるかに異なって複雑です。私がこれまで試したことのようなものです:

trait SomeHelper { 
    class CoolFunction(right: String => Boolean) extends Function1[List[String], List[Any]] { 
    inst => 
    override def apply(left: List[ String ]): List[ Any ] = { 
     left match { 
     case a: List[String] => a.filter(right) 
     case _ => List() 
     } 
    } 
    } 

    def coolFunction(right: String => Boolean) = new CoolFunction(right) 
} 

object SomeHelper extends SomeHelper 

import SomeHelper._ 

val myList = List("apple", "orange", "banana") 

myList coolFunction { 
    a => a == "orange" 
} 

は「値coolFunctionが[文字列]リストのメンバーではない」私を生成し、私はとても近くだけど

を、それを把握することはできませんように

を感じています

+0

なぜあなたは 'List.filter'を使用しての代わりに、独自の機能の種類を作成していませんか?あなたはコレクションに述語を適用したいようです。 –

+0

@ YuvalItzchakov再び、私はロジックを単純化しました。この例は実際にはマップ/フィルタの再実装のように見えます。 – kali

+0

おそらく実際にやっていることに向かって私たちを歩いてみてください。これは私にとってあまり意味がありません。 –

答えて

0

私は暗黙のクラスを使うことができると思います。既存の型にメソッドを追加することができます。

implicit class MyListHelper(list: List[String]) { 

    def doStuff(function: String => Any): List[Any] = { 
    list.map(function) 
    } 
} 

そして、このようにそれを使用します。

import MyListHelper 

val list = List("a", "b", "c") 
val result = list.doStuff(s => s + s) // List("aa", "bb", "cc") 
+0

はい、これは私がしなければならなかったことでした。上記の私のアプローチでは、抽象としてCoolFunctionを作成し、私自身が提供するジェネリック条件で適用関数を作成するようにユーザーに指示します。暗黙のうちに私が似たようなことをすることができるかどうか知っていますか?最悪のシナリオ私は 'doStuff'定義に2つのlambdaを持ち、内部でdoStuff func1(funct2)を構成します。 – kali

関連する問題