簡體   English   中英

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

人類的讀者可以看到他們實際上是在說

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM