Haskell中的“ let”和变量

yom*_*min 1 haskell

我是Haskell的新手,正在阅读“学习Haskell的伟大成就!”。

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

doubleMe = 2
Run Code Online (Sandbox Code Playgroud)

该代码实际上遵循上述规则,因此我们可以将其视为一个函数。但实际上似乎是用Java或C ++ 进行的赋值操作。

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

Jon*_*rdy 5

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

two :: Int
two = 2
Run Code Online (Sandbox Code Playgroud)

或函数的定义:

twice :: Int -> Int
twice x = x * two
Run Code Online (Sandbox Code Playgroud)

如果定义的类型带有功能箭头,则表示该功能->。

在do块或GHCi中,let name = expression是局部定义。

main :: IO ()
main = do
  let greet name = "Hello, " ++ name ++ "!"
  putStrLn (greet "world")
Run Code Online (Sandbox Code Playgroud)

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

length (let x = "hello" in x ++ x)  ==  10
Run Code Online (Sandbox Code Playgroud)

  • 注意`do`块中的`let`只是嵌套`do`块的语法糖:`do let foo = ...; ...` 与 `do let foo = ... in do ...` 相同。 (2认同)