2013-03-16 8 views
0

당신이 하스켈 데이터 형식자바에서 haskell 데이터 형식을 구현하는 방법은 무엇입니까?

data Mlist a = Mlist [a] 

data Mordering = MLT | MEQ | MGT | MIN deriving (Eq, Show) 

이있는 경우 뭐죠 자바에서이 쓸 수있는 가장 좋은 방법은?

+0

자바의 기존 목록 데이터 형식의 잘못은 무엇? 후자에 관해서는, 나는 자바를 정말로 모르지만, 어떤 종류의 열거가 있어야합니다 ... –

+0

어쩌면 당신은 http://jamesiry.github.com/jADT/index.html을 볼 수 있습니다. – huynhjl

답변

8

Java에서 sum-only 형식을 원한다면 쉽습니다. 그냥 enum를 사용

public enum Mordering { 
    MLT, MEQ, MGT, MIN 
} 

을 당신도 무료로 평등, toString() 및 기타 유용한 것들을 얻을. 당신은 전체 ADT (제품의 합)이 필요한 경우

public class Mlist<T> { 
    public final List<T> list; 

    public Mlist(List<T> list) { 
     this.list = list; 
    } 
} 

는하지만, 다음 일을 더 복잡 얻을 수 있습니다 : 당신이 당신의 Mlist 같은 제품 전용 유형을해야 할 경우, 간단한 클래스는 갈 방법입니다.

일반적으로 이러한 유형은 상속을 사용하여 인코딩됩니다. Guava Optional 클래스를 고려하십시오. Haskell Maybe 데이터 유형과 동일합니다. Optional이라는 기본 클래스와 두 개의 하위 클래스 인 Present (Haskell Just에 매핑되고 Absent에 매핑되며 Nothing에 매핑 됨)로 모델링됩니다. 또한 기본 클래스 인 Optional에는 Optional.of(value) 또는 Optional.absent()과 같은 유용한 팩토리 메소드가 포함되어 있습니다. 나는 이것이 당신이 사용해야하는 접근법이라고 생각합니다.

그러나 패턴 일치가없는 ADT 값은 빠르게 줄어 듭니다. 나는 당신이 자바에서 하스켈 관용구를 사용하려고하지 않는 것이 좋다고 생각한다. 왜냐하면 이것들은 완전히 다른 언어 들이기 때문에 각기 다른 패턴과 기법을 가지고 있기 때문이다. 일반적인 개념 중 일부는 (Optional/Maybe과 같이) 두 가지 모두에서 유용 할 수 있지만 대개 이러한 언어의 문제에 대해 완전히 다른 접근 방식이 있습니다. 할 수있는 가장 방법이

abstract sealed class Optional[+T] 
case class Present[+T](value: T) extends Optional[T] 
case class Absent() extends Optional[Nothing] 
2

확실하지 경우 :

BTW, 스칼라 언어는 보통 확장 abstract sealed 기본 클래스와 여러 case classes을 사용하여 유사한 방식으로 모델 ADT를 (또한 JVM에서 실행) 그것.

그러나 아이디어를 얻으려면 다음을 수행 할 수 있습니다. frege compiler을 통해이 코드를 실행하고 생성 된 Java 코드를 살펴보십시오.

(프레게가 누락 하스켈 - JVM 백엔드을 만회하려고 JVM을 언어입니다. 프레게는 기본적으로 하스켈 2010 플러스 순위가 높은 다형성 유형 및 Java 상호 운용성입니다.)

관련 문제