HASKELL --- 在 GHCI 的 "do" 语法中使用 "let"
HASKELL --- Using "let" within a "do" syntax in GHCI
我知道这行得通:
do name <- getLine; let nameTag = "Hello, my name is " ++ name in putStrLn nameTag
以及加载到 GHCI 时的这段代码:
hey = do
name <- getLine
let nameTag = "Hello, my name is " ++ name
putStrLn nameTag
但这不起作用:
do name <- getLine; let nameTag = "Hello, my name is " ++ name; putStrLn nameTag
给出以下错误信息:
<interactive>:142:82:
parse error (possibly incorrect indentation or mismatched brackets)
为什么不起作用?我能让它工作吗?如果是,那又如何?
是的,您可以在 let 绑定周围使用大括号来消除解析歧义:
do name <- getLine; let { nameTag = "Hello, my name is " ++ name }; putStrLn nameTag
为了补充 McKenna 的回答,错误可以解释如下:比较这两行
do name <- getLine; let name1 = "One"; putStrLn name1
do name <- getLine; let name1 = "One"; name2 = "Two"; putStrLn name1
人类 reader 可以看出他们的意思
do { name <- getLine; let { name1 = "One" } ; putStrLn name1 }
do { name <- getLine; let { name1 = "One"; name2 = "Two" }; putStrLn name1 }
但解析器并不那么聪明。
当 Haskell 解析器看到公共代码部分时
do name <- getLine; let name1 = "One";
-- ^ --
它必须决定最后一个;
是属于do
级(如上面第一种情况),还是属于let
级(第二种情况)。原来它选择了let
,后来又失败了
我知道这行得通:
do name <- getLine; let nameTag = "Hello, my name is " ++ name in putStrLn nameTag
以及加载到 GHCI 时的这段代码:
hey = do
name <- getLine
let nameTag = "Hello, my name is " ++ name
putStrLn nameTag
但这不起作用:
do name <- getLine; let nameTag = "Hello, my name is " ++ name; putStrLn nameTag
给出以下错误信息:
<interactive>:142:82:
parse error (possibly incorrect indentation or mismatched brackets)
为什么不起作用?我能让它工作吗?如果是,那又如何?
是的,您可以在 let 绑定周围使用大括号来消除解析歧义:
do name <- getLine; let { nameTag = "Hello, my name is " ++ name }; putStrLn nameTag
为了补充 McKenna 的回答,错误可以解释如下:比较这两行
do name <- getLine; let name1 = "One"; putStrLn name1
do name <- getLine; let name1 = "One"; name2 = "Two"; putStrLn name1
人类 reader 可以看出他们的意思
do { name <- getLine; let { name1 = "One" } ; putStrLn name1 }
do { name <- getLine; let { name1 = "One"; name2 = "Two" }; putStrLn name1 }
但解析器并不那么聪明。 当 Haskell 解析器看到公共代码部分时
do name <- getLine; let name1 = "One";
-- ^ --
它必须决定最后一个;
是属于do
级(如上面第一种情况),还是属于let
级(第二种情况)。原来它选择了let
,后来又失败了