[英]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
人類的讀者可以看到他們實際上是在說
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
,然后失敗。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.