3

したがって、問題は shapeless ライブラリhttps://github.com/milessabin/shapelessの HLists を理解することにあります。私はHListsいくつかの関数を保存するために使用しています:

val list = HList(
    function1(_),
    function2(_),
    ....
    functionn(_)
);

そして、それは完璧に機能します。リストから任意の関数を取得して適用できます。 list.head(object)

しかし、map関数(list map mapFunc)で適用するのに問題があります:

object mapFunc extends Poly1 {
  implicit def default[T] =
    at[T](t => {
      t(obj)
    })
}

それは言いApplication doesnt take parametersます。では、どうすれば対処できますか?Mb私はsmthを理解していませんか?私はScalaが初めてです。

psコンストラクターには興味深い効果があります。このコードは少し間違っています:

function1(_) :: function2(_) :: HNil何らかのタイプの関数として認識されますHList(function1(_), function2(_))が、正しいタイプを持っています。

編集

'ps' が決定されました -function1(_) :: function2(_) :: HNil本当に型の不一致があります。function1 _ :: function2 _ :: HNilでも大丈夫です!

4

1 に答える 1

4

最初に最後の質問です。リストはHNilではなくで締めくくる必要がありますHList。たとえば、次のような場合:

def function1(s: String) = "foo " + s
def function2(s: String) = s.toInt
def function3(s: String) = s + " bar"

次のように書きます。

val list = function1 _ :: function2 _ :: function3 _ :: HNil

since::は、Scala 標準ライブラリ (および他の言語) にある cons 演算子に似ており、最初の引数 (アイテム) を受け取り、2 番目の引数 (リスト) の前に追加します。

それでは最初の質問です。HList先ほど定義した I を考えると、次のように書くことができます。

val obj = "13"

object mapFunc extends Poly1 {
  implicit def funcTo[T] = at[String => T](f => f(obj))
}

その後:

scala> (list map mapFunc) == "foo 13" :: 13 :: "13 bar" :: HNil
res0: Boolean = true

重要なのは、マップ要素が文字列 (またはオブジェクト タイプが何であれ) から何かへの関数である場合にケースが適用されるという事実を表す必要があるということです。

于 2013-10-13T16:10:24.490 に答える