1

私の問題は非常に単純です。値がまだ関数になっていない場合は、値を関数に暗黙的に変換したいと考えています。暗黙的なパラメーターのインスタンス化を要求することで、タイプ セーフなパターンを使用する予定です (値が関数の場合、暗黙的な作成は失敗します)。ただし、値が関数ではないことをテストする方法がわかりません

以前の質問の 1 つで、ユーザーのベリリウムからタイプ セーフ パターンを学びました。参照 : 操作の繰り返しを許可しないタイプ セーフなメソッド チェーン

私が実装した暗黙的なものは機能していますが、うまくいきすぎています。not関数式を特定アプリデフォルト関数に自動変換したい

 implicit def defaultExecutionUnitParameterNReturn(a: Any): Unit => MyDefaultReturn = 
{u : Unit => a }.andThen(_ => defaultReturn())

ただし、ユーザーが「a」を関数として実装すると、アプリケーションは失敗します

だから私の最初のアイデアは次のようなものでした

 implicit def defaultExecutionUnitParameterNReturn[A](a: A)(implicit e : A =!= Function) Unit => MyDefaultReturn = 
{u : Unit => a }.andThen(_ => defaultReturn())

A と B が同じ型の場合、 implicit =!=[A,B] は失敗します。しかし「機能」は存在しない

4

2 に答える 2

0

以下のコードを調べてください。これは、標準の暗黙的な変換の例です。は何でも取り、それを単に単純化toFunnction0した に変換します。Function0[R]() => R

implicit def toFunnction0[R](r: => R): Function0[R] = () => r

def iWantFunction0(f0: () => String) = {
  f0()
}

def testFun = {println("computing string in testFun..."); "ABC"} //every time when called block of code will run
val abcVal = "ABC" //this is computed only once

iWantFunction0(testFun)

//here abcVal is not a function, so implicit works. 
//toFunnction0 is in scope, so compiler will translate it into
//iWantFunction0(toFunnction0(abcVal))  
iWantFunction0(abcVal)  
于 2013-10-25T11:00:59.147 に答える