Avatar
omochimetaru 4/6/2021 9:41 AM
パラメータとして与えられた型を制約にするのって無理なんだな あくまで最初から静的にプロトコル名を与えないといけないのか (edited)
9:41 AM
あ、いや、そうか・・・
9:43 AM
enum Either<L, R> { case left(L) case right(R) } extension Either { func join<C>( type: C.Type = C.self, left: (L) -> C, right: (R) -> C ) -> C { switch self { case .left(let x): return left(x) case .right(let x): return right(x) } } } class Animal {} final class Cat: Animal {} final class Dog: Animal {} func main(_ x: Either<Cat, Dog>) -> Animal { x.join { $0 } right: { $0 } }
9:44 AM
class Animal {} final class Cat: Animal {} final class Dog: Animal {} final class Bird: Animal {} func main(_ x: Either<Cat, Dog>) -> Animal { x.join { $0 } right: { $0 } } func main2(_ x: Either<Either<Cat, Dog>, Bird>) -> Animal { x.join { $0.join { $0 } right: { $0 } } right: { $0 } }