Scalaでのインライン関数のあいまいさ

user3681304

関数として持ち上げられた演算子を定義された高階関数の1つに渡す場合、Scalaは非常に簡潔な構文を許可します。たとえば(.product()に簡略化できるという事実を無視してください)。

List(1,2,3).fold(1)(_ * _)

上記に私はただ渡すことができます _ \* _

ただし、独自のおもちゃ関数zipWith()を定義したので、関数を渡すときは非常に明示的にする必要があります。

implicit class EnrichedList[A](val self: List[A]) extends AnyVal {
  def zipWith[B, C](that: List[B])
                   (implicit zipper: A => B => C): List[C] = {

    def zipWithHelper(zipper: A => B => C)
                     (as: List[A])
                     (bs: List[B]): List[C] = {
      (as, bs) match {
        case (_, Nil) => Nil
        case (Nil, _) => Nil
        case (a :: restOfA, b :: restOfB) =>
          zipper(a)(b) :: zipWithHelper(zipper)(restOfA)(restOfB)
      }
    }

    zipWithHelper(zipper)(self)(that)
  }
}

これ:機能しList(1, 3, 4).zipWith(List(3, 4, 5))(_ * _)ない、と言って

エラー:(60、46)拡張関数のパラメータータイプがありません((x $ 1:、x $ 2)=> x $ 1. $ times(x $ 2))List(1、3、4).zipWith(List(3、4) 、5))(_ * _)

関数が取る引数のタイプを言う必要があります:

List(1, 3, 4).zipWith(List(3, 4, 5))((x: Int) => (y: Int) => x * y)

なぜコンパイラは私が速記バージョンを渡すことを許可しないの_ * _ですか?

アンドレイ・トゥキン

_ * _はの省略形ではありません(x: Int) => (y: Int) => x * yの省略形です(x: Int, y: Int) => x * yのタイプzipper(A, B) => Cではなくに変更するA => B => C、機能するはずです。カリー化は重要であり、恒等関数の単なる名前ではありません。

これはここでコンパイルされます:

implicit class EnrichedList[A](val self: List[A]) {
  def zipWith[B, C](that: List[B])
                   (implicit zipper: (A, B) => C): List[C] = {

    def zipWithHelper(zipper: (A, B) => C)
                     (as: List[A])
                     (bs: List[B]): List[C] = {
      (as, bs) match {
        case (_, Nil) => Nil
        case (Nil, _) => Nil
        case (a :: restOfA, b :: restOfB) =>
          zipper(a, b) :: zipWithHelper(zipper)(restOfA)(restOfB)
      }
    }

    zipWithHelper(zipper)(self)(that)
  }
}

println( List(1, 3, 4).zipWith(List(3, 4, 5))(_ * _) )

とプリント

List(3, 12, 20)

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

MSVC-オーバーロードされた関数へのC2668のあいまいな呼び出し-コンパイラのバグですか?

分類Dev

JS React:this.x関数がバインドされている場合でも、this.xのエラーは関数ではありません

分類Dev

C ++、STL、GDB:インライン化されている可能性のある関数を評価できません

分類Dev

次のインライン関数は同じ実装であることが保証されていますか?

分類Dev

関数scalaのパイプライン

分類Dev

デシリアライザーのポップ関数のテンプレート化された特殊化に関するあいまいさ

分類Dev

C ++のオーバーロードされた関数ポインタのあいまいさ

分類Dev

すべてのライブラリ関数はデフォルトでリンクされていますか

分類Dev

Kotlinインライン関数のパラメータがnullであってはならない理由

分類Dev

Cコードのリント:関数のパラメーター(ポインター)はconstである可能性があります。*しかし*私は渡されたポインタに書いています

分類Dev

インポートされた関数の関数エラーではありません

分類Dev

関数型プログラミングに関するいくつかの本では、インスタンスメソッドはコンパニオンオブジェクトで定義されたバイナリ関数に委任します。その背後にある実用的な理由はありますか?

分類Dev

$ scopeがAngularJSの関数内でバインドされていません

分類Dev

プリコンパイルされたAzure関数のパラメーターでILoggerインスタンスが初期化されていません

分類Dev

ARMでのアラインされていないメモリアクセスのための関数

分類Dev

C ++での複数ファイルのコンパイル中に「関数が宣言されていません」

分類Dev

Haskellポイントフリーバージョンの関数があいまいな型エラーを引き起こすのはなぜですか?

分類Dev

メンバー関数set_valueへのエラー呼び出しがあいまいです(pugixmlライブラリを使用するxcodeで)

分類Dev

Uncaught TypeError:$は、ログインしていない場合にのみWPの関数ではありません

分類Dev

Fortranでのインライン関数

分類Dev

「関数が定義されていません」ReactJsのコンポーネントのインラインonClick関数?

分類Dev

コンパイラは、MatrixXdの構築は関数であり、メンバーではないと考えています

分類Dev

関数をC ++でインライン化できるのはいつですか?インライン動作を強制できますか?

分類Dev

ジャスミンのスタブ関数は、「...は関数ではありません」というタイプエラーになります。

分類Dev

新しい関数をスローします。FirebaseCloud関数でhttps.HttpsErrorがクライアントの内部エラーとして拒否されます

分類Dev

関数の符号があいまいなポインターパラメーターを定義する

分類Dev

インライン関数内のNULLをチェックしています

分類Dev

低次関数型プログラミング、それはScalaの良いスタイルですか?

分類Dev

クラスインスタンスのあいまいな変数

Related 関連記事

  1. 1

    MSVC-オーバーロードされた関数へのC2668のあいまいな呼び出し-コンパイラのバグですか?

  2. 2

    JS React:this.x関数がバインドされている場合でも、this.xのエラーは関数ではありません

  3. 3

    C ++、STL、GDB:インライン化されている可能性のある関数を評価できません

  4. 4

    次のインライン関数は同じ実装であることが保証されていますか?

  5. 5

    関数scalaのパイプライン

  6. 6

    デシリアライザーのポップ関数のテンプレート化された特殊化に関するあいまいさ

  7. 7

    C ++のオーバーロードされた関数ポインタのあいまいさ

  8. 8

    すべてのライブラリ関数はデフォルトでリンクされていますか

  9. 9

    Kotlinインライン関数のパラメータがnullであってはならない理由

  10. 10

    Cコードのリント:関数のパラメーター(ポインター)はconstである可能性があります。*しかし*私は渡されたポインタに書いています

  11. 11

    インポートされた関数の関数エラーではありません

  12. 12

    関数型プログラミングに関するいくつかの本では、インスタンスメソッドはコンパニオンオブジェクトで定義されたバイナリ関数に委任します。その背後にある実用的な理由はありますか?

  13. 13

    $ scopeがAngularJSの関数内でバインドされていません

  14. 14

    プリコンパイルされたAzure関数のパラメーターでILoggerインスタンスが初期化されていません

  15. 15

    ARMでのアラインされていないメモリアクセスのための関数

  16. 16

    C ++での複数ファイルのコンパイル中に「関数が宣言されていません」

  17. 17

    Haskellポイントフリーバージョンの関数があいまいな型エラーを引き起こすのはなぜですか?

  18. 18

    メンバー関数set_valueへのエラー呼び出しがあいまいです(pugixmlライブラリを使用するxcodeで)

  19. 19

    Uncaught TypeError:$は、ログインしていない場合にのみWPの関数ではありません

  20. 20

    Fortranでのインライン関数

  21. 21

    「関数が定義されていません」ReactJsのコンポーネントのインラインonClick関数?

  22. 22

    コンパイラは、MatrixXdの構築は関数であり、メンバーではないと考えています

  23. 23

    関数をC ++でインライン化できるのはいつですか?インライン動作を強制できますか?

  24. 24

    ジャスミンのスタブ関数は、「...は関数ではありません」というタイプエラーになります。

  25. 25

    新しい関数をスローします。FirebaseCloud関数でhttps.HttpsErrorがクライアントの内部エラーとして拒否されます

  26. 26

    関数の符号があいまいなポインターパラメーターを定義する

  27. 27

    インライン関数内のNULLをチェックしています

  28. 28

    低次関数型プログラミング、それはScalaの良いスタイルですか?

  29. 29

    クラスインスタンスのあいまいな変数

ホットタグ

アーカイブ