4

たとえば、スコープ内に (Scalaz の)length型クラスのインスタンスがある場合に、指定された構造体の長さを返す関数を書きたいとします。Length

これは私が現在それを定義する方法です:

scala> def length[A, F[_] : Length]: F[A] => Int = _.len
length: [A, F[_]](implicit evidence$1: scalaz.Length[F])F[A] => Int

length(List(2, 3))ただし、この場合、暗黙的なパラメーターが必要な最初の引数であるため、などの呼び出しは失敗します。

scala> length(List(2, 3))
<console>:15: error: type mismatch;
 found   : List[Int]
 required: scalaz.Length[?]
              length(List(2, 3))
                         ^

length(implicitly)(List(2, 3))はうまくいくと思っていましたが、セッションをクラッシュさせてしまいます (型推論は左から右に流れるので理解できます)。明示的な型注釈を提供することは機能しますが、耐えられないほど醜いです。

scala> length(implicitly[Length[List]])(List(2, 3))
res16: Int = 2

のようなファースト クラスの関数を記述しlength、コンテキストをバインドして、使用場所で通常の関数と同じようにきれいに呼び出すことができる良い方法はありますか? (のようにlength(List(2, 3)))

4

1 に答える 1

6

簡単に、カンニング!

scala> def length[A, F[_] : Length]: F[A] => Int = _.len
length: [A, F[_]](implicit evidence$1: scalaz.Length[F])F[A] => Int

scala> List(2, 3) |> length
res0: Int = 2
于 2011-11-01T16:44:06.330 に答える