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

Haskell 存储对文件句柄/DB句柄等的引用的首选方法。。。?,haskell,Haskell,在Learn You A Haskell一书中,有一个使用do符号来分配tempName和tempHandle: do ... (tempName, tempHandle) <- openTempFile "." "temp" 当转换为>=时,我将如何引用句柄 main = openFile "name.txt" WriteMode >> putStrLn "Enter your name: " >> getLine >

在Learn You A Haskell一书中,有一个使用
do
符号来分配
tempName
tempHandle

do
    ...
    (tempName, tempHandle) <- openTempFile "." "temp"
当转换为
>=
时,我将如何引用
句柄

main =
    openFile "name.txt" WriteMode >>
    putStrLn "Enter your name: " >>
    getLine >>=
    (\name -> hPutStr handle?? name) >>
    hClose handle??
第二个更难读,你为什么要用它

要完成您的示例,请执行以下操作:

main =
    openFile "name.txt" WriteMode >>= \handle ->
    putStrLn "Enter your name: " >>
    getLine >>=
    (\name -> hPutStr handle name) >>
    hClose handle
第二个更难读,你为什么要用它

要完成您的示例,请执行以下操作:

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

去除do符号中糖分的直接方法是:

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

请注意,
\handle->
之后的整个内容是同一个函数体的一部分,因此
handle
在以下所有表达式的范围内。

直接去除do符号中的糖分的方法是:

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

请注意,
\handle->
之后的整个内容是同一个函数体的一部分,因此
handle
在以下所有表达式的范围内。

我只是想知道是否有更好的方法。如果您想打开一个文件,使用
>=
转换几次内容,然后写回文本,会发生什么情况?你需要将
句柄传递给每个
>=
吗?还是更倾向于使用
Do
符号或
where
子句?Do符号正是作为
>=
的语法糖发明的,让你的生活更轻松:)那很酷,我只是想更好地理解
=/code>语法,感觉像是
do
对我隐瞒了一些事情。请用一个简单的、精心设计的代码示例查看我的更新问题。只有一个
>=
将提供句柄,即本答案中提到的句柄。您将在其他文件操作中使用它,例如
..>=\(tempName,tempHandle)->读取文件tempHandle>=\content->写入文件tempHandle(frob内容)>>hClose tempHandle
。在do表示法中更容易阅读,但在bind表示法中也不太糟糕。请注意,lambda
\(tempName,tempHandle)->…
在函数的最末端结束,而不是在下一个
>=
结束。我想这是你误解的根源。在do表示法中是一样的:每个
x我只是想知道是否有更好的方法。如果您想打开一个文件,使用
>=
转换几次内容,然后写回文本,会发生什么情况?你需要将
句柄传递给每个
>=
吗?还是更倾向于使用
Do
符号或
where
子句?Do符号正是作为
>=
的语法糖发明的,让你的生活更轻松:)那很酷,我只是想更好地理解
=/code>语法,感觉像是
do
对我隐瞒了一些事情。请用一个简单的、精心设计的代码示例查看我的更新问题。只有一个
>=
将提供句柄,即本答案中提到的句柄。您将在其他文件操作中使用它,例如
..>=\(tempName,tempHandle)->读取文件tempHandle>=\content->写入文件tempHandle(frob内容)>>hClose tempHandle
。在do表示法中更容易阅读,但在bind表示法中也不太糟糕。请注意,lambda
\(tempName,tempHandle)->…
在函数的最末端结束,而不是在下一个
>=
结束。我想这是你误解的根源。在do表示法中,它是相同的:每个
x在Haskell中缩进
putStrLn
行以及以后的行,以便更清楚地表明最后4行是匿名函数的一部分,这是常见的做法吗?按照您编写的方式,除了第2行末尾的
->
之外,没有明确说明还有匿名函数。在绑定块中,按上述方式缩进代码是相当常见的,因为否则我们需要越来越多地缩进。当然,do块更常见。也很常见:
forM_u[1..n]$\i->do
后跟一个换行符和缩进的do块。所以,是的,
\x->
在这行的末尾是很常见的。我第一次看到它时,它看起来很奇怪,但现在不再如此了。此外,请记住,Haskell中没有标准缩进(如Java或Scala)。Haskell中的常见做法是缩进
putStrLn
行及以后的内容,以更清楚地表明最后4行是匿名函数的一部分吗?按照您编写的方式,除了第2行末尾的
->
之外,没有明确说明还有匿名函数。在绑定块中,按上述方式缩进代码是相当常见的,因为否则我们需要越来越多地缩进。当然,do块更常见。也很常见:
forM_u[1..n]$\i->do
后跟一个换行符和缩进的do块。所以,是的,
\x->
在这行的末尾是很常见的。我第一次看到它时,它看起来很奇怪,但现在不再如此了。此外,请记住Haskell中没有标准缩进(例如Java或Scala)。
main =
    openFile "name.txt" (WriteMode) >>= \handle ->
    putStrLn "Enter your name: " >>
    getLine >>= \name ->
    hPutStr handle name >>
    hClose handle