在Learn You A Haskell一书中,a todo example使用do
表示法来分配tempName
和tempHandle
:
do
...
(tempName, tempHandle) <- openTempFile "." "temp"
这意味着整个函数都可以访问tempName
和tempHandle
,这意味着您可以在最后openTempFile
和hClose
之间执行任何操作。但是,由于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??
答案 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
适用于以下所有表达式。