2013-09-26 3 views
3

내가 haskell에서 데이터 유형을 만들고이 데이터 유형이 여러 생성자를 허용한다고 가정 해 봅니다. 나중에 내 코드에서 어떤 코드를 작성했는지 쉽게 판단 할 수 있습니까?Haskell에서 유형 결정

편집 :

예, 나는 dataType와

data LogicValue = CloseAnd (Int, Int) (Int, Int) 
      | CloseXor (Int, Int) (Int, Int) 
      | FarAnd LogicValue LogicValue 
      | FarXor LogicValue LogicValue 

뭔가 인스턴스에 대한 CloseAnd 여부를 결정하는 쉬운 방법이 있나요을 사용하고 있습니다?

+0

당신 둘은 서로 20 초 이내에 대답을 ... 나는 당신에게 모두를 표시 할 수 있으면 좋겠다 옳은. 그들이 머리카락에 처음으로 있었기 때문에 왼쪽 방향으로 표시했습니다. – SwiftCore

답변

9

물론 생성자 이름에 패턴 일치 만!

f :: LogicValue -> Ret 
f (CloseAnd a b) = ... 
f (CloseXor a b) = ... 

물론 case 스위치를 사용하여 동일한 작업을 수행 할 수 있습니다.


이 질문은 (내가 정직하면 내 대답은 아마도 꽤 가치가 있지 않는, 표에게 그것을 가지고) 나는 당신의 문제는 아무것도하지 않는 것을 추가 할 내 알림 상자에 나타나는 유지하기 때문에 "유형 결정"과 관련이 있습니다. data의 다른 생성자는 모두과 동일한 결과 유형, 즉 LogicValue을가집니다. O3 언어처럼 "하위 유형"CloseAnd, CloseXor ...에 대해 생각하고있을 것입니다. 하스켈 변형 타입은 OO 클래스 계층 구조와 몇 가지 유사점을 가지고 있지만 여전히 다른 개념입니다.

5

당신은 그것을 위해 패턴 매칭을 사용

logictype :: LogicValue -> [Char] 
logictype (CloseAnd _ _) = "It is a closeAnd." 
logictype (CloseXor _ _) = "It is a closeXor." 
logictype (FarAnd _ _) = "It is a FarAnd." 
logictype (FarXor _ _) = "It is a FarXor." 

또한 매개 변수와 일치 할 수

logictype (CloseAnd (a,b) (c,d)) = "it is a closeAnd with parameters " ++ show [a,b,c,d]