Haskell:绑定模式在哪里匹配

时间:2018-07-05 22:01:02

标签: haskell pattern-matching pattern-guards

目前,我正尝试通过在线教程Learn you a Haskell学习Haskell。在“函数中的语法”一章中,作者写道:“您还可以使用where绑定来匹配模式!”。之后,有一部分代码示例,但是我不知道在哪里将模式匹配与新的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

要替换的新where部分:

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

因为我想了解本教程中解释的Haskell的所有代码示例和语法方法,所以我希望有人可以解释这里使用模式匹配的地方以及它在这里如何工作。 对我来说,问题是我只能看到护板和一种将所有东西都绑定到体重和身高的图案。

1 个答案:

答案 0 :(得分:5)

(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是绑定两个名称的模式。当然在这种情况下没有必要,我们可以将模式放在参数中。但这确实偶尔会派上用场。