【问题标题】:Learning Haskell: where-clause variable x, where does it come from?学习 Haskell:where-clause 变量 x,它从何而来?
【发布时间】:2019-12-23 22:00:56
【问题描述】:

我正在学习 Haskell,这将是我的第一篇文章。

在伟大的在线书籍http://learnyouahaskell.com/syntax-in-functions#where 中有一个例子largestDivisble。在 where 子句中引入了变量 x,但它来自哪里?到目前为止,函数体的模式匹配部分中的变量是有界的。

正如我现在解释的那样: where p x 部分声明了函数p 和一些变量x 的应用。在 filter p [some-list] 正文中,some-list 代表 x

我认为这有点模糊。有人可以帮我解释一下这段代码吗?

    largestDivisible :: (Integral a) => a  
    largestDivisible = head (filter p [100000,99999..])  
        where p x = x `mod` 3829 == 0  

【问题讨论】:

  • 呸,多么好的实现啊。 largestDivisible = 100000 - 100000 `mod` 3829 似乎更直接。
  • 是的,这是聪明的方式,当然,这是一个演示过滤功能的例子:)

标签: haskell


【解决方案1】:

x 只有函数参数。它完全在 p 的定义中。

您可以将其定义为单独的顶级函数,如下所示:

p :: (Integral a) => a -> Bool
p x = x `mod` 3829 == 0

请注意,此处的类型签名不是必需的,将它包含在顶级函数中只是一个好习惯。 where 子句中p 的定义是相同的,包括x 是函数参数的本地名称。两者之间的唯一区别是where 子句中定义的函数是包含该子句的定义的本地函数,不能在外部访问。

【讨论】:

  • 谢谢,您的回答证实了我的猜测。声明“它完全是 p 的定义的局部”现在确实使一切都清楚了。所以 where 子句只是定义了一个新函数,但对封闭函数是局部的。 :)
  • @rik_mg 是的,它等价于where p = (\x -> x mod` 3829 == 0)` 在右侧我们找到了一个lambda/匿名函数\x -> ...
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-06-09
  • 1970-01-01
  • 2018-04-29
  • 2019-04-26
  • 2013-09-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多