2016-12-19 2 views
1

これはうまくいきますが、私はタグタイプが何であるべきかわからないので、コンパイラの助けを避けたいと思います。フィールドタイプのことを知っています。私は理想的に持っていると思い何Scala - パラメータタイプがありません - コンパイラの支援を避けることは可能でしょうか?

val x: TypeString = TypeString("test") 

TypeValidator.validate[TypeString](x, x => { 
    true 
}) 

がある:(Xタイプが推測されている)

TypeValidator.validate(x, x => { 
    true 
}) 

についてはこちらに周りに検索た
import models.implementations.Field 

object TypeValidator { 
    def apply(): TypeValidator = { 
    new TypeValidator() 
    } 
    def validate[T <: Field](t: T, v: T => Boolean): Boolean = { 
    new TypeValidator().validate(t, v) 
    } 
} 

class TypeValidator { 
    def validate[T <: Field](t: T, v: T => Boolean): Boolean = v.apply(t) 
} 

を次のようにバリデーションクラスがあります私はこれを避けることができないかもしれないとの結論に達しましたが、私は誰かが解決策を持っていることを願っています。

おそらく、私は答えを見つけに来て最も近いがここにいた:

scala anonymous function missing parameter type error

更新は - ちょうど追加する、これは作業を行いますが、私はまだ良い解決策があるかもしれません感じます。

TypeValidator.validate(x)(x => { 
    true 
}) 

クラスを匿名関数のパラメータの2番目のセットに変更しました。

class TypeValidator { 
    def validate[T <: Field](t: T)(v: T => Boolean): Boolean = v.apply(t) 
} 
+1

さらに、あなたは、関数の引数の周りに括弧を省略すべきことができますか? –

+4

2番目のソリューションから中括弧を削除し、かっこで置き換えることができます。より少ない入力と私の意見で*ソリューションです。カレー化は、推論のタイプを助けるために行うのが一般的なことです。例えば、リスト上の 'foldLeft'はこれを使います。 –

+0

@MichaelZajac、これは何よりもハックを感じます。このソリューションは機能しますが、あまりにも複雑すぎます。 –

答えて

2

は不validateの署名が複雑になります

class TypeValidator { 
    def validate[T <: Field](t: T)(v: T => Boolean): Boolean = v.apply(t) 
} 

他のソリューションよりも優れた解決策はありません。

Scalaの型inferencerがパラメータを通過するには、1つずつ一覧表示されますので、それは、古いバージョンを見たとき、それは、関数の引数とField引数の両方からTを推測しようとした、および関数の引数の型が全く完全ではなかったために失敗しました知られている。ここで、推論子は、関数の引数を考慮せずにField引数をとり、そのT = TypeStringを推測します。これにより、関数の引数の型を推論することができます。

これは、Scala標準ライブラリ全体と、基本的に他のすべてのScalaライブラリで非常によく見られるパターンです。あなたが最後の解決策については好きではない何

TypeValidator.validate(x) { x => 
    true 
} 
関連する問題