Shapeless Features Overview ukazuje następujący przykład:Zrozumienie `Monomorphism` Przykład bezkształtne
import poly._
// choose is a function from Sets to Options with no type specific cases
object choose extends (Set ~> Option) {
def apply[T](s : Set[T]) = s.headOption
}
scala> choose(Set(1, 2, 3))
res0: Option[Int] = Some(1)
scala> choose(Set('a', 'b', 'c'))
res1: Option[Char] = Some(a)
Jednak nie wm brakiem doświadczenia bezkształtnym, zrozumienie różnicy między tym i są następujące:
scala> def f[T](set: Set[T]): Option[T] = set.headOption
f: [T](set: Set[T])Option[T]
scala> f(Set(1,2,3))
res0: Option[Int] = Some(1)
scala> f(Set('a', 'b', 'c'))
res1: Option[Char] = Some(a)
Dzięki za wyjaśnienie. Kolejny przykład w instrukcji "pairApply" również jest dobrym przykładem. Proszę mi powiedzieć, czy "mógłbym" napisać jako funkcję przez 'def'? Ciekawi mnie, dlaczego zastosowano podejście "object ...". –
'choose' można zapisać jako * metodę * na obiekcie, ale nie może to być funkcja * * (a * wartość * typu' Funkcja1'). Zaletą posiadania go jako "obiektu" jest to, że można go przekazać do innej funkcji bez utraty generic: 'def applyToIntsAndStrings (mapper: Set ~> Option): (Option [Int], Option [String]) = (mapper (Set (1, 2), Mapper (Set ("Hello"))))), a następnie możemy wywołać 'applyToIntsAndStrings (choose)'. Nie możesz tego zrobić z ogólnym 'def'. – lmm