Align
Zipと似たような型クラスですが、Zipよりある意味汎用的に使える型クラスです。
以下のようなシグネチャのalignWith
という抽象メソッドがあります。
def alignWith[A, B, C](f: A \&/ B => C): (F[A], F[B]) => F[C]
\&/
はTheseとも呼ばれるデータ構造です。
Alignは\&/
と密接に関連しており、\&/
を理解していないとAlignの説明をするのは難しいので、
\&/
を知らない人はまずそちらの説明を参照してください。
まず、標準ライブラリのListを使った例を見てみましょう。 標準ライブラリのListのzipメソッドでは、長さが揃っていない場合は、短い方に合わせて切り捨てられますが
val x = List("a", "b", "c", "d")
val y = List(1, 2)
x zip y
// res0: List[(String, Int)] = List(("a", 1), ("b", 2))
Alignを使用した場合、切り捨てられるのではなく
Align[List].align(x, y)
// res1: List[String \&/ Int] = List(
// Both("a", 1),
// Both("b", 2),
// This("c"),
// This("d")
// )
Align[List].align(y, x)
// res2: List[Int \&/ String] = List(
// Both(1, "a"),
// Both(2, "b"),
// That("c"),
// That("d")
// )
- 両方が存在する部分まではBoth
- 1つめの引数のほうが長い場合は、残りはThis
- 2つめの引数のほうが長い場合は、残りはThat
というような結果になります。
List以外にもAlignのインスタンスになっているデータ型はいくつかあります。