【问题标题】:'let' and variables in HaskellHaskell 中的“让”和变量
【发布时间】:2017-03-15 06:30:25
【问题描述】:

我是 Haskell 的新手,我正在阅读“Learn You a Haskell for Great Good!”。

用“名称”和“空格”定义的表达式,后跟“参数”可以用作函数。 考虑以下代码:

doubleMe = 2

这段代码实际上遵循了上面的规则,所以我们可以把它看成一个函数。但它确实看起来像是 java 或 c++ 中的 assign 操作。

那么,如何理解 Haskell 中的变量呢?

【问题讨论】:

  • 你需要弄清楚 doubleme 到底是什么,你使用了变量这个词......为什么?
  • 您是在编写 Haskell 程序(.hs 文件)还是使用 ghci?在 ghci 中你需要 let,在普通的源文件中你不需要。
  • 另外我不知道您是否在问“变量和函数之间有什么区别?”或者您是否在问“使用 'let' 和不使用 'let' 有什么区别?”
  • doubleMe 不是函数,因为函数必须有参数。另见:conal.net/blog/posts/everything-is-a-function-in-haskell
  • @immibis GHC 8 在顶级 GHCi 中将 let 设为可选。

标签: haskell


【解决方案1】:

在程序的顶层,name = expression 是一个定义。它创建了一个变量,在数学变量的意义上——只是某个表达式的名称。它可以是一个值的定义:

two :: Int
two = 2

或者一个函数的定义:

twice :: Int -> Int
twice x = x * two

一个定义引用一个函数,如果它的类型有一个函数箭头->

do 块或 GHCi 中,let name = expression 是一个本地定义

main :: IO ()
main = do
  let greet name = "Hello, " ++ name ++ "!"
  putStrLn (greet "world")

最后,let 关键字还有另一个用途:let name = expression1 in expression2。这会为单个表达式创建一个局部变量:

length (let x = "hello" in x ++ x)  ==  10

请注意,let 采用 绑定,因此它与其他布局关键字一样受布局规则的约束,例如 dowhereof,如 @ 987654335@…of等:

main :: IO ()
main = do

  -- Bindings must be aligned past the start column.
  --  ↓
  let greeting name = "Hello, " ++ name ++ "!"
      parting name = "Goodbye, " ++ name ++ "!"

  putStrLn (greeting "world")
  putStrLn (parting "world")

 

length $ let x = "hello"
             y = "goodbye"
  in x ++ y

与其他布局关键字一样,可以改为在let之后放置一个换行符和固定数量的缩进,然后不用担心对齐:

main = do              -- ← newline+indent
  let                  -- ← newline+indent
    greeting name = …
    parting name = …
  …

 

length $ let
  x = "hello"
  y = "goodbye"
  in x ++ y

或者你总是可以包含显式的花括号和分号:

main :: IO ();
main = do {
  let {
    greeting name = "Hello, " ++ name ++ "!";
    parting name = "Goodbye, " ++ name ++ "!";
  };
  putStrLn (greeting "world");
  putStrLn (parting "world");
};
length $ let {
    x = "hello";
    y = "goodbye";
  } in x ++ y

【讨论】:

  • 注意do 块中的let 只是嵌套do 块的语法糖:do let foo = ...; ...do let foo = ... in do ... 相同。
猜你喜欢
  • 2019-07-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-02
相关资源
最近更新 更多