Haskell:绑定模式匹配的地方

Posted

技术标签:

【中文标题】Haskell:绑定模式匹配的地方【英文标题】:Haskell: where bindings pattern match 【发布时间】:2018-12-14 11:25:39 【问题描述】:

目前我正在尝试通过在线教程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】:

线

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

【讨论】:

以上是关于Haskell:绑定模式匹配的地方的主要内容,如果未能解决你的问题,请参考以下文章

Haskell 和 Erlang 中的模式匹配

Haskell 模式匹配 - 它是啥?

Haskell:为啥模式匹配中不允许使用 ++?

Haskell:为什么++不允许模式匹配?

如何在haskell中对两个参数进行模式匹配

如何在Haskell中与代数类型进行模式匹配