Haskell 存储对文件句柄/DB句柄等的引用的首选方法。。。?
在Learn You A Haskell一书中,有一个使用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 >
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