대수 데이터 형식으로 쉽게 해결할 수있는 몇 가지 문제가 있습니다. 예를 들어 목록 형식은 다음과 같이 간결하게 표현할 수 있습니다.
data ConsList a = Empty | ConsCell a (ConsList a)
consmap f Empty = Empty
consmap f (ConsCell a b) = ConsCell (f a) (consmap f b)
l = ConsCell 1 (ConsCell 2 (ConsCell 3 Empty))
consmap (+1) l
이 특정 예제는 Haskell에 있지만 대수 데이터 형식을 기본적으로 지원하는 다른 언어에서도 비슷합니다.
OO 스타일 하위 유형에 대한 명확한 매핑이 있음이 밝혀졌습니다. 데이터 유형은 추상 기본 클래스가되고 모든 데이터 생성자는 구체적인 하위 클래스가됩니다. 스칼라의 예는 다음과 같습니다.
sealed abstract class ConsList[+T] {
def map[U](f: T => U): ConsList[U]
}
object Empty extends ConsList[Nothing] {
override def map[U](f: Nothing => U) = this
}
final class ConsCell[T](first: T, rest: ConsList[T]) extends ConsList[T] {
override def map[U](f: T => U) = new ConsCell(f(first), rest.map(f))
}
val l = (new ConsCell(1, new ConsCell(2, new ConsCell(3, Empty)))
l.map(1+)
순진한 서브 클래 싱 외에 필요한 것은 클래스를 봉인 하는 방법, 즉 서브 클래스를 계층 구조에 추가하는 것을 불가능하게하는 방법입니다.
C # 또는 Java와 같은 언어로이 문제에 어떻게 접근 하시겠습니까? C #에서 대수 데이터 형식을 사용하려고 할 때 발견 한 두 가지 걸림돌은 다음과 같습니다.
- 나는 C #에서 하단 유형이 무엇인지 알 수 없었습니다 (즉, 무엇을 넣을 지 알 수 없었습니다
class Empty : ConsList< ??? >
) - 하위 클래스를 계층 구조에 추가 할 수 없도록 봉인 하는 방법을 알 수 없었습니다.
ConsList
C # 및 / 또는 Java에서 대수 데이터 형식을 구현하는 가장 관용적 인 방법은 무엇입니까? 또는 가능하지 않은 경우 관용적 대체물은 무엇입니까?