Охрана, Pattern Matching и различные уравнения в Haskell

Возвращаясь к примеру с моими животными:

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 были введены как "Берт", "Дональд", "Гораций", я бы хотел, чтобы он выполнил одно конкретное уравнение, но если бы они были введены как "Берт", "Дональд", "Шейла", я бы хотел, чтобы он выполнил другое уравнение?

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 -}

отправлять по-разному на имена. Как видите, подчеркивание соответствует чему-либо и полезно для указания того, что вы обработали все свои особые случаи и теперь нуждаетесь в чем-то общем.

Если вы хотите, вы можете использовать доступное сокращение, потому что параметры функции также являются шаблонами - например, вы можете сделать это:

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 -}

В этом случае, однако, я рекомендую case…ofи потому, что его легче читать, и потому что, когда вы хотите что-то изменить в аргументах, вам не нужно изменять каждое уравнение.

Другие вопросы по тегам