我是 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),因此它像其他布局关键字一样受布局规则的约束,例如 do
, where
, of
as in case
…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 ()<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/