【问题标题】:What does the "in" keyword do in Haskell?Haskell 中的“in”关键字有什么作用?
【发布时间】:2018-10-08 15:23:51
【问题描述】:

我无法理解 haskell 中“in”关键字的全部范围。我的理解是,您可以使用它将参数传递给函数。但是,我无法理解如何应用于类似于下图所示的函数:

foo xs a =
   case xs of
      [] -> (a,[])
      y:ys ->
         let (n,ns)=foo ys a in
         if y>0 then (1+n,y:ns)
         else (n,ns)

如果方程提供了 foo 不采用的参数,“in”如何应用于方程?

【问题讨论】:

  • (1) 吹毛求疵:in 不是一个独立的关键字;它总是伴随着letlet {- definitions -} in {- expression that uses the definitions -}。 (2) 在您的情况下,let 表达式定义了nns,分别为fooysa
  • @duplode 这不是吹毛求疵,这就是答案。你应该这样发布。
  • @SebastianRedl 我现在无法以令人满意的方式写出完整的答案。如果其他答案没有涵盖,我会稍后再做。

标签: haskell


【解决方案1】:

inlet 一起在纯函数中命名一个或多个局部表达式。

所以,用一个更简单的例子,

foo = 
  let greeting = "hello" in 
    print (greeting ++ " world")

将打印“hello world”。

但你也可以使用很多lets:

foo = 
  let greeting = "hello"
      greetee  = "world" in
    print (greeting ++ " " ++ greetee)

您只需要一个in 就可以使用您刚刚定义的名称。

而且这些名称绝对必须用作函数的参数——它们几乎可以是任何东西,甚至是函数本身!

foo = 
  let f = print in
    f "hello world"

在您的示例中,let 表达式定义了两个名称,nns,它们在函数体中使用。

【讨论】:

    猜你喜欢
    • 2017-04-11
    • 1970-01-01
    • 2019-04-05
    • 1970-01-01
    • 2019-09-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-12
    相关资源
    最近更新 更多