Haskell:绑定模式匹配的地方

Dan*_*mon 1 haskell pattern-matching pattern-guards

目前我正在尝试通过在线教程学习Haskell来学习Haskell.在"函数中的语法"一章中,作者写道"你也可以使用绑定到模式匹配的地方!".之后有一部分代码示例,但我不知道模式匹配与新的where绑定一起使用的位置.因为代码块的第一部分被缩短了("我们可以将我们之前函数的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
Run Code Online (Sandbox Code Playgroud)

要替换的新where部分:

where bmi = weight / height ^ 2  
      (skinny, normal, fat) = (18.5, 25.0, 30.0)
Run Code Online (Sandbox Code Playgroud)

因为我想了解本教程中解释的Haskell的所有代码示例和语法方法,所以我希望有人可以解释在这里使用模式匹配的位置以及它在这里的工作原理.对我来说,问题是我只看到了防护装置和一种将一切都与重量和高度联系在一起的模式.

luq*_*qui 5

这条线

(skinny, normal, fat) = (18.5, 25.0, 30.0)
Run Code Online (Sandbox Code Playgroud)

是一种模式绑定 - 模式是(skinny, normal, fat)一种绑定三个名称的元组模式.您还可以在where(和let)中使用其他类型的模式,例如:

head' :: [a] -> a
head' list = x
    where
    x : xs = list
Run Code Online (Sandbox Code Playgroud)

x : xs是一个绑定两个名字的模式.当然,在这种情况下,我们可以将模式放在参数中.但它偶尔会派上用场.