存储对文件句柄/ DB句柄等的引用的首选方法......?

时间:2016-08-16 08:03:56

标签: haskell

在Learn You A Haskell一书中,a todo example使用do表示法来分配tempNametempHandle

do
    ...
    (tempName, tempHandle) <- openTempFile "." "temp"

这意味着整个函数都可以访问tempNametempHandle,这意味着您可以在最后openTempFilehClose之间执行任何操作。但是,由于do符号明显是>>=的语法糖,我试图将do转换为绑定,并且发现难以维护对tempHandle的引用

由于我对Haskell的理解有限,我看到了几个选项:

  • tempHandle存储在where子句中,以便可以从该功能访问;
  • tempHandle中的>>=引用与我在绑定的每个步骤中需要的其他数据一起传递:(return ("Transformed Data", tempHandle)!)。

你会怎么做?我是从错误的角度接近这个吗?

修改:如果您在以下示例中将handle表示法转换为do,我将如何保留对>>=的引用:

main = do
    handle <- openFile "name.txt" (WriteMode)
    putStrLn "Enter your name: "
    name <- getLine
    hPutStr handle name
    hClose handle

转换为>>=后,我将如何引用handle

main =
    openFile "name.txt" WriteMode >>
    putStrLn "Enter your name: " >>
    getLine >>=
    (\name -> hPutStr handle?? name) >>
    hClose handle??

2 个答案:

答案 0 :(得分:3)

do
  (tempName, tempHandle) <- openTempFile "." "temp"
  ...

相同
openTempFile "." "temp" >>= \(tempName, tempHandle) ->
...

第二个更难阅读,为什么要使用它?

完成你的例子:

main =
    openFile "name.txt" WriteMode >>= \handle ->
    putStrLn "Enter your name: " >>
    getLine >>=
    (\name -> hPutStr handle name) >>
    hClose handle

答案 1 :(得分:3)

对减号表进行除糖的直接方法是:

main =
    openFile "name.txt" (WriteMode) >>= \handle ->
    putStrLn "Enter your name: " >>
    getLine >>= \name ->
    hPutStr handle name >>
    hClose handle

请注意,\handle ->之后的整个事物是同一个函数体的一部分,因此handle适用于以下所有表达式。