双重和模式匹配

时间:2014-07-05 11:56:20

标签: haskell

我有这段代码:

main = do
  args <- getArgs
  (var1, var2, var3, var4) <- return ("my var1", "my var2", "my var3", "my var4")    

  -- or
  -- (var1, var2, var3, var4) <- do
  --   return ("my var1", "my var2", "my var3", "my var4")  

  putStrLn "Var3 is: " ++ var3

  return ()

但现在它没有做任何有用的事情。但它没有给我错误:

 #1
    Couldn't match expected type `[Char]' with actual type `IO ()'
    In the return type of a call of `putStrLn'
    In the first argument of `(++)', namely
      `putStrLn "Var3 is: "'
    In a stmt of a 'do' block: putStrLn "Var3 is: " ++ var3

    #2
    Couldn't match type `[]' with `IO'
    Expected type: IO Char
      Actual type: [Char]

有趣的是,如果我将该行putStrLn "Var3 is: " ++ var3注释掉,那么它编译得很好。

为什么?在putStrLn“Var3 ..”之前没有额外的空间,因此不应该像对待第二个“do”块那样对待它。

我该如何解决这个问题?

1 个答案:

答案 0 :(得分:4)

您的(主要)问题是在putStrLn的函数应用程序之前评估函数应用程序(++)。所以你真正得到的是

(putStrLn "Var3 is: ") ++ (var3)

这没有意义,因为(++)需要两个字符串,而不是字符串和I / O操作。要解决此问题,您可以在字符串周围放置括号:

putStrLn ("Var3 is: " ++ var3)

或使用函数应用程序运算符($)

putStrLn $ "Var3 is: " ++ var3