2014-11-07 2 views
0

나는 하스켈에서 DSL을위한 함수를 만드는 프로젝트를 진행 중이다. 우리는 우리 자신의 Types를 만들고 다양한 함수를 작성하는 데 사용합니다.하스켈 - isBread 함수

data Layer  = Bread Bread   | Meat Meat   | 
      Cheese Cheese  | Vegetable Vegetable | 
      Condiment Condiment 
      deriving (Eq,Show) 

data Bread  = White | Wheat | Rye 
      deriving (Eq,Show) 

내가 지금하고있는 것은 레이어를 취하고 그것이 빵인지 아닌지 true 또는 false를 반환하는 isBread 함수를 구현하는 것입니다.

isBread :: Layer -> Bool 
isBread b | White = True 
      | Wheat = True 
      | Rye = True 
      | otherwise = False 

위 코드를 사용하면 예상되는 'Bool'유형과 'Bread'유형을 일치시킬 수 없다는 오류가 발생합니다.

isBread :: Layer -> Bool 
isBread b | Bool a = True while b = White 
      | Bool a = True while b = Wheat 
      | Bool a = True while b = Rye 
      | otherwise Bool a = False 

위의 코드를 시도하여 실제 Boolean을 반환하려고 시도했지만 구문 분석 오류가 발생했습니다. 내 구문이 꺼져 있지만 그것이 내가 원하는 것을 해야하는 것처럼 보일지 모르겠다. 어떤 제안?

+2

오류가있는 곳을 보려면이 선언을보십시오 'data Layer = Bread String | Meat String' 그리고'isBread'라고 쓰십시오. –

답변

9

여기에는 두 가지 문제가 있습니다. 첫 번째 구문은 구문입니다. 가드와 패턴 일치에는 차이가 있습니다. 가드는 임의의 (계산 가능한) 조건이 있는지 여부를 확인하기위한 것이지만 패턴 일치는 값이 특정 모양을 갖고 있는지 확인하기위한 것입니다. 여기에 패턴 일치를 사용해야하며, 기본적으로 그 생각을 가지고 있다고 생각합니다. 우리는이 함수의 유형에 대한 ghci을 요구하는 경우에, 우리는 꽤하지 않습니다 찾을 그러나

isBread White = True 
isBread Wheat = True 
isBread Rye = True 
isBread _  = False 

: 우리는 대신 가드 구문의 패턴 일치 구문을 사용하는 isBread의 당신의 정의를 수정하는 경우, 우리는 약간의 진전을 하나는 우리가 원 :

> :t isBread 
isBread :: Bread -> Bool 

우리는 정말 오른쪽 Layer -> Bool을 입력 무언가를 원했다? 문제는 일치하는 도형이 Bread 모양 인 것입니다. data Bread = ... 수식의 오른쪽에 나타나는 것 - Layer 모양이 아닙니다. data Layer = ... 수식의 오른쪽에 나타나는 것입니다.

이 힌트가 isBread :: Layer -> Bool 유형의 기능을 작성하는 데 약간의 진전을 가져 오기를 바랍니다.

+0

AHA! 알았다. 빵 (빵 b) = 참. 방향 주셔서 감사합니다. – LEKenobi