2013-11-20 2 views
0

다른 식 :감시, 패턴 매칭 및 내 동물의 예를 다시 얻기 하스켈

type Pig = String 
type Lion = String 
type Feed = [(Char,Char)] 
type Visitors = [(Char,Char)] 
type Costs = (Int,Int,Int) 

data AnimalHome = Farm Pig Pig Pig Feed | Zoo Lion Lion Lion Feed Visitors 

orders :: Char -> AnimalHome -> Costs -> Char 
orders stuff Farm p1 p2 p3 feed (cost1,cost2,cost3) = some code here 

어떻게 다른 방정식을 실행할 것인가? p1 p2 p3가 "Bert" "Donald" "Horace"로 입력되면 하나의 특정 방정식을 실행하고 싶습니다. 그러나 "Bert" "Donald" "Sheila"로 입력 된 경우 다른 특정 방정식을 실행해야합니다. 방정식?

답변

1

원칙은 패턴 일치입니다. 즉, 다음을 수행 할 수 있습니다.

orders stuff (Farm p1 p2 p3 feed) (cost1,cost2,cost3) = 

    case (p1, p2, p3) of 
    ("Bert", "Donald", "Horace") -> {- something -} 
    ("Bert", "Donald", "Sheila") -> {- something different -} 
    (_,  "Abraham", _)  -> {- when p2 is "Abraham" and the others can be anything -} 
    _        -> {- this is the default case -} 

다른 이름으로 발송할 수 있습니다. 보시다시피, 언더 스코어는 무엇이든 일치하며, 특별한 경우를 모두 처리 했으므로 이제는 일반적인 것을 필요로한다는 것을 나타내는 데 유용합니다.

원하는 경우 함수 매개 변수도 패턴 (예 : .csv)이기 때문에 사용 가능한 속기를 사용할 수 있습니다. 그러나, 나는 쉽게 읽을 모두 때문에 case…of를 추천하고 인수에 뭔가를 변경할 때마다 방정식을 수정할 필요가 없기 때문에,이 경우

orders stuff (Farm "Bert" "Donald" "Horace" feed) (cost1,cost2,cost3) = {- something -} 
orders stuff (Farm "Bert" "Donald" "Sheila" feed) (cost1,cost2,cost3) = {- something different -} 
orders stuff (Farm p1  "Abraham" p3  feed) (cost1,cost2,cost3) = {- when p2 is "Abraham" and the others can be anything -} 
orders stuff (Farm p1  p2  p3  feed) (cost1,cost2,cost3) = {- this is the default case -} 

:이 작업을 수행 할 수 있습니다 .

+1

확실히 Farm 생성자는 하위 패턴과 함께 괄호 안에 있어야합니다. – Ingo

+0

@Ingo 물론. 나는 아직 커피를 마시지 않았다. 감사! – kqr

+0

ghci를 실행하려면 어떻게해야합니까? – James