Haskell: где шаблон привязок совпадает

В данный момент я пытаюсь выучить Haskell с помощью онлайн-учебника Learn you a Haskell. В главе "Синтаксис в функциях" автор написал "Вы также можете использовать привязки к шаблону!". После этого есть часть примера кода, но я не знаю, где сопоставление с образцом используется вместе с новым, где привязка. Поскольку первая часть блока кода была укорочена ("Мы могли бы переписать раздел where нашей предыдущей функции как"), вы можете только вывести его, но я думаю, что выбрал правильную часть.

Функция:

bmiTell :: (RealFloat a) => a -> a -> String  
bmiTell weight height  
    | bmi <= skinny = "You're underweight, you emo, you!"  
    | bmi <= normal = "You're supposedly normal. Pffft, I bet you're ugly!"  
    | bmi <= fat    = "You're fat! Lose some weight, fatty!"  
    | otherwise     = "You're a whale, congratulations!"  
    where bmi = weight / height ^ 2  
          skinny = 18.5  
          normal = 25.0  
          fat = 30.0

Новый раздел где заменить:

where bmi = weight / height ^ 2  
      (skinny, normal, fat) = (18.5, 25.0, 30.0)

Поскольку я хочу понять все примеры кода и синтаксические методы Haskell, описанные в этом руководстве, я надеюсь, что кто-то может объяснить, где здесь используется сопоставление с образцом и как оно работает здесь. Проблема для меня в том, что я вижу только охранников и один шаблон, который привязывает все к весу и росту.

1 ответ

Решение

Линия

(skinny, normal, fat) = (18.5, 25.0, 30.0)

это шаблон привязки - шаблон (skinny, normal, fat)шаблон кортежа, который связывает три имени. Вы также можете использовать другие виды шаблонов в where (а также let), например:

head' :: [a] -> a
head' list = x
    where
    x : xs = list

Вот x : xs это шаблон, который связывает два имени. Конечно, в этом случае нет необходимости, мы могли бы просто указать шаблон в аргументе. Но это иногда бывает полезно.

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