Avatar
別のことをしていてすっかり遅刻してしまいましたが、いちおうScalaを業務で書いているマンとしてちょっとenum vs protocol をやっていきたいと思います。 protocol A {} class B: A{} class C: A{} vs enum A { case b(B) case c(C) }
👀 1
4:11 PM
この2つですが、もしかして会場では答えでている可能性あって、そうしたら申し訳ないんですが、まさに上の方で議論されているようにSwiftにはsealdがないので、protocolを利用した上の例では、予想しないような実装(クラス・構造体)が作られる恐れがあり、またパターンマッチで網羅性を検査することができません。
4:12 PM
じゃあ、下のenumがいいのか、という議論になるかというとそうではなくて、(勘違いだったら申し訳ないんですが)Swiftのenumの各タグ(?、たとえば上記の例でいうaとかb)はたしか型パラメーターが取れないです。
👉 1
4:13 PM
だから、たとえば型レベルリスト(HList)のようなデータ構造を作りたいときは、パターンマッチの網羅性を犠牲にしてでも前者のprotocolをつかって次のようにやるしかない、といった感じになるんじゃないでしょうか。 public protocol HList { } public struct HNil: HList { init() { } } public struct HCons<H, T: HList>: HList { public let head: H public let tail: T public init(_ h: H, _ t: T) { self.head = h self.tail = t } }
4:13 PM
この例ではタグ(?)としてHNilHConsがありますが、HConsが型パラを取るので、こうしています。