haskell - Haskell 中的 'let' 和变量

我是 Haskell 的新手,我正在阅读“学习 Haskell 大有裨益!”。

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

doubleMe = 2

这段代码实际上遵循了上面的规则,因此我们可以将其视为一个函数。但它看起来确实像是 Java 或 C++ 中的赋值操作。

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

最佳答案

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

two :: Int
two = 2

或者一个函数的定义:

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

如果定义的类型具有函数箭头 ->,则定义指的是函数。

do block 或 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 接受一个 block 绑定(bind),因此它像其他布局关键字一样受布局规则的约束,例如 dowhere, of as in caseof, 等等:

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 ()<strong>;</strong>
main = do <strong>{</strong>
  let <strong>{</strong>
    greeting name = "Hello, " ++ name ++ "!"<strong>;</strong>
    parting name = "Goodbye, " ++ name ++ "!"<strong>;</strong>
  <strong>};</strong>
  putStrLn (greeting "world")<strong>;</strong>
  putStrLn (parting "world")<strong>;</strong>
<strong>};</strong>
length $ let <strong>{</strong>
    x = "hello"<strong>;</strong>
    y = "goodbye"<strong>;</strong>
  <strong>}</strong> in x ++ y

https://stackoverflow.com/questions/40371572/

相关文章:

python - django 模板中的多个加载标签

r - 删除取值小于 n 的列?

performance - AWS 资源共享

reactjs - 如何淡入淡出文本

user-interface - 如何更改 NativeScript 标签的文本

macos - 从 Mac OSX 移除 Saltstack

angular - 循环调用 Angular2 服务

winapi - Windows 函数调用中的堆栈是如何设置的?

git - 如何直接从 Google Cloud Source Repository 部署到 Goo

python - 在 python 中的 .ttf 字体文件中检索所有字形的边界框和贝塞尔曲线数据