27

私は次のように書いた

def mapFun[T, U](xs: List[T], f: T => U): List[U] = (xs foldRight List[U]())( f(_)::_ )

そして私がしたとき

def f(x: Int):Int=x*x
mapFun(List(1,2,3), f)

うまくいきました。しかし、私は本当に次の作品も作りたかったのです

mapFun(List(1,2,3), x=>x*x)

「パラメータータイプがありません」と文句を言います。カリー化を使用できることはわかっていますが、上記の非カリー化定義に匿名関数を引き続き使用する方法はありますか?

4

2 に答える 2

35

「f」は「xs」と同じパラメータリストにあるため、コンパイラが解決できるように、x の型に関する情報を提供する必要があるようです。

あなたの場合、これはうまくいきます:

mapFun(List(1,2,3) , (x: Int) => x * x)  

x が Int であることをコンパイラにどのように通知しているかわかりますか?

あなたができる「トリック」は f をカリー化することです。カリー化とは何かがわからない場合は、これをチェックしてください: http://www.codecommit.com/blog/scala/function-currying-in-scala

次のような mapFun になります。

def mapFun[T, U](xs: List[T])(f: T => U): List[U] = 
    (xs foldRight List[U]())( f(_)::_ )

そして、これはうまくいきます:

mapFun(List(1,2,3))(x => x * x)

最後の呼び出しでは、コンパイラが最初のパラメーター リストをチェックするときに x の型が解決されます。

編集:

ドミニクが指摘したように、型が何であるかをコンパイラに伝えることができます。につながる:

mapFun[Int, Int](List(1,2,3), x => x * x)

乾杯!

于 2012-10-29T02:12:24.317 に答える
17

ここで実行している scala の型システムの制限は、型情報がパラメーター グループ全体で左から右に流れ、パラメーター グループ内で左から右に流れないことです。

Tこれが意味することは、 を提供して型パラメーターを指定してもList[Int]、 のようなグループ内の他のパラメーターにその情報が提供されないということですf。これにより、パラメーターの型が見つからないというエラーが発生します。ただしf、 f が次のパラメーター グループの一部である場合は、 に提供されます。これが、カリー化された関数アプローチが機能する理由です。

つまり、次のように定義した場合:

def mapFun[T, U](xs: List[T])(f: T => U): List[U] = (xs foldRight List[U]())( f(_)::_ )

最初のパラメーター グループ: asTで定義した型パラメーターは、次のパラメーター グループ: で使用できるようになります。したがって、呼び出しサイトで明示的に指定する必要はありません。(xs: List[T])Int(f: T => U)T

于 2012-10-29T02:30:12.807 に答える