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
это шаблон, который связывает два имени. Конечно, в этом случае нет необходимости, мы могли бы просто указать шаблон в аргументе. Но это иногда бывает полезно.