2

Scala は初めてなので、 、 、 で遊んでいfoldましreducescan。関数パラメーターで要素が渡される順序と、最終結果がどのように組み立てられるかを確認したかったのです。数値と文字列のリストで使用する予定だったので、型パラメーターを使用して次のヘルパー関数を定義しました。

scala> def vizAdd[A](p1:A, p2:A):A = {
 |   val res:A = p1 + p2
 |   println( s" * ($p1, $p2) => $res" )
 |   res
 | }
<console>:8: error: type mismatch;
 found   : A
 required: String
       val res = p1 + p2
                      ^

Scala でジェネリック型パラメーターを使用したPost Additionは解決策を提案し、+ メソッドが操作するには数値型が必要であるという事実に焦点を当てているため、Numeric[A] 型の暗黙のパラメーターをメソッドに追加することでうまくいくはずです。不運にも:

scala> def vizAdd[A](p1:A, p2:A)(implicit n: Numeric[A]):A = {
 |   val res:A = p1 + p2
 |   println( s" * ($p1, $p2) => $res" )
 |   res
 | }
<console>:8: error: type mismatch;
 found   : A
 required: String
         val res:A = p1 + p2
                          ^

[A:Numeric]in instead を使用した構文(implicit n: Numeric[A])も機能しません...

上記の投稿(以下のコード) で実装されているシングルトン オブジェクト「GenericTest」をコンパイルすると、同じエラー「検出: A、必要: 文字列」が発生します。

object GenericTest extends App {
  def func1[A](x: A, y: A)(implicit n: Numeric[A]): A = x + y    
}

ここで何が欠けていますか?

私はScala 2.11.5を使用しています

4

1 に答える 1

3

Numericトレイトには 、 などのメソッドがありplus、次のようtimesに使用されます。

def func1[A](x: A, y: A)(implicit n: Numeric[A]): A = n.plus(x, y) 

あなたが探しているのは、 、 などAの中置操作を持つようにエンリッチする暗黙の変換です。つまり、これは次のとおりです。+*

import scala.math.Numeric.Implicits.infixNumericOps

def func1[A](x: A, y: A)(implicit n: Numeric[A]): A = x + y

または、少し構文糖衣を加えたもの:

def func1[A: Numeric](x: A, y: A): A = x + y 
于 2015-03-01T20:17:34.427 に答える