1

これについて助けが必要です:

例えば:

val myArray= Array(1, 2, 4, 5, -1, -7, 11, 29)

これは分かります :myArray.exists( _ < 0 )

また、私はこれを理解できます:myArray.count(_ % 2 == 0)

しかし、REPLでこれを書く方法:

myArray.forall( !xyz(_) )     xyz is this _ % 2 == 0 like above

次のエラーが表示されます。

"error: missing parameter type for expanded function ((x$1: <error>, x$2) => x$1.unary_$bang.$percent(2).$eq$eq(0(x$2)))
              myArray.count( !_ % 2 ==0(_) )"

私はEclipse 4.4を持っています。ルナ。

4

3 に答える 3

1

あなたの例の1つのバリエーションを見てみましょう:

myArray.count(!(_ % 2 == 0))

このスニペットでは、式が括弧で囲まれているため、コンパイラは、期待どおり_ % 2 == 0全体としてではなく、それ自体を無名関数として解析します。!(_ % 2 == 0)

括弧内を関数として扱うと、コンパイラはプレースホルダーの型を推測できません。注釈を追加することでこれを修正できると思うかもしれません。

myArray.count(!((_: Int) % 2 == 0))

しかし、作成した無名関数に単項演算子を実際に適用しているため、これも!機能しません。

これを回避するには、述語を単純化できます...

myArray.count(_ % 2 != 0)

...またはプレースホルダーを完全に削除します。

myArray.count(n => !(n % 2 == 0))


編集:上記の提案はおそらく問題を解決するための最良の方法ですが、次の (無効な) 式を入力したときに受け取ったエラー メッセージに直接対処するものではありません。

myArray.count(!_ % 2 == 0(_))

ここには 2 つの問題があります。1 つ目は、無名関数_ % 2 == 0が括弧で囲まれていないため、コンパイラが式全体!_ % 2 == 0(_)が 2 つの変数の無名関数であると認識してしまうことです。

無名関数を括弧で囲むと、

myArray.count(!(_ % 2 == 0)(_))

コンパイラは 2 つのパラメーターを検索しなくなったため、進歩がありましたが、埋め込み関数のプレースホルダーの型を推測できないため、注釈を付ける必要があります。

最後に、

myArray.count(!((_: Int) % 2 == 0)(_))

これは期待どおりに機能します。確かに、上記のソリューションほどエレガントではありませんが、機能します。

于 2014-09-30T23:12:19.790 に答える
0

_ を 2 回使用すると、2 つのパラメーターを持つ関数を定義することになります。これは非常に奇妙なものです。コンパイラは、2 つのパラメーターの型を導出しようとしている間、ステートメントを理解できないと通知しますが、これは不可能です。

これが可能になる前のケースでは、たとえば

myArray.exists(_ < 0) 

コンパイラは、Array[Int] に存在することを認識しており、関数 Int から Bool を期待しています。したがって、コードは次のように展開されます

myArray.exists((x : Int) => x < 0) 

あなたの場合、あなたは書くべきです:

myArray.forall( _ % 2 != 0)

代替案は

def xyz(n: Int) = n % 2 == 0
myArray.forall(!xyz(_))

より適切なエラー メッセージは、「forall は関数 Int => Bool here を期待しています」のようなものです。Scalaには暗黙の存在があるため、これは不可能だと思います。このことについては、Martin Odersky の Scala book の第 8 章で詳しく読むことができます。

于 2014-09-30T22:52:15.480 に答える
0

これは、この質問と同じです: Scala unexpectedly not being able to ascertain the type forexpanded function . 注:!関数でもあります

于 2014-09-30T22:52:23.667 に答える