2013-02-12 3 views
4

place라는 새 데이터 선언을 만들려고합니다.Haskell의 case 문에서 기본값 사용

그것은 다음과 같습니다

data place = United States | France | England | Germany | Mexico | Canada

내 희망은 다음과 같이 자본에 열릴 캡라는 함수를 사용하는 것입니다

cap :: place -> String 
cap a = case a of 

      Spain   -> "Madrid" 
      France   -> "Paris" 
      England   -> "London" 
      Germany   -> "Berlin" 
      Mexico   -> "Mexico City" 
      Canada   -> "Ottawa" 
      _    -> undefined 

그러나 지난 경우, 어디에서 데이터 선언에 존재하지 않을 수도있는 다른 모든 항목을 잡으려고하면 작동하지 않습니다. 예를 들어 GHCI에 capital Wales을 입력하면 정의되지 않은 응답이 표시되지 않습니다. 대신 범위 오류가 아닙니다. 누군가가 내 혼란을 도우면서 다른 케이스를 잡으려고 합법적 인 방법을 제공 할 수 있습니까?

+0

일시적으로 코드에 다른 국가 추가'data Place = Temp | 미국 | ... '그러면'cap Temp'를 테스트 할 수 있습니다. – AndrewC

+2

(현재 귀하의 데이터 선언이 깨졌습니다.'data place = UnitedStates | France | England | Germany | Mexico | Canada') – AndrewC

답변

9

누락 된 사례를 처리하는 방법에 문제가 없습니다. 어떻게 처리하는지는 문제가되지 않습니다. 문제는 Wales 생성자가 단순히 존재하지 않는다는 것입니다. 따라서 정의되지 않은 변수 나 함수를 사용하려고 할 때와 마찬가지로 컴파일 오류가 발생합니다. cap 함수는 호출되지 않습니다. 따라서 변경할 수 없으므로이 동작에 영향을줍니다. 존재하지 않는 생성자를 사용하는 코드를 컴파일 할 수있는 방법은 없습니다.

4

capital Wales을 입력하면 범위에 Wales이 없습니다. 존재하지 않는 값을 생성하는 것은 불가능합니다. 모든 가능한 케이스를 다룬 경우 기본 케이스는 필요하지 않습니다.

+0

이것은 의미가 있습니다. 사용자가 선언문에있는 국가 만 알지 못하는 경우 기본 유형의 "catching"문을 제시 할 수있는 방법이 없습니다. – ZAX

+0

@ZAX 기본 구문에는 구문이 올바르지 만이 경우를 트리거하는 값은 전달할 방법이 없습니다. 컴파일러가 먼저 오류를 잡을 것입니다 : – singpolyma

3

sepp2k의 답변과 singpolyma의 답변에 대한 논점은 하스켈의 통합 유형이 이라는 것을 의미합니다.입니다. n 사례로 합집합 유형을 정의 할 때 하스켈에 유형에 맞는 경우가 n 인 경우입니다. singpolyma가 지적했듯이 하스켈에게 다른 케이스도 이 존재하지 않는다고 말했습니다..

이점과 단점이 있습니다. Exhaustiveness는 사용자와 컴파일러가 사용자의 기능이 주어진 모든 가능한 입력을 처리하고 있음을 보장 할 수 있음을 의미합니다. 단점은 컴파일 타임에 사례 집합이 고정된다는 것입니다. 당신이 국가와 수도를 대표하는 런타임에 임의의 여러 인스턴스를 만들 수있는

  1. 사용에 "열기"형 하나

    여기에 간단한 대안은 두 부분이다. 문자열은 여기서 좋은 문자열입니다. 런타임시 구성 할 수있는 무한 수의 서로 다른 문자열이 있습니다. 그러나 문자열 멤버와 함께 레코드 유형을 사용할 수도 있습니다.

  2. 키/값 할당 데이터 구조를 사용하여 국가와 대문자 간의 연결을 나타냅니다.

그래서 당신은 다음과 같이 국가와 도시를 나타낼 수 :

-- Since there are infinitely many different strings you could construct at runtime, 
-- there are also infinitely many different Cities and Nations... 
data City = City String deriving (Eq, Ord, Show) 
data Nation = Nation String deriving (Eq, Ord, Show 

간단한 키/값 매핑 유형, [(k, v)]입니다 종종 연관리스트으로 알려져 있습니다. 물론 O (n) 검색 시간이 있습니다. 더 좋은 방법은 하스켈 플랫폼과 함께 제공되는 Data.Map을 사용하는 것입니다.

+2

또는 그는 자신의 공용체에'기타 문자열'이라는 용어를 대체로 추가 할 수 있습니다. –

관련 문제