gpt4 book ai didi

haskell - 在这个例子中,我可以确定 IO 操作的顺序吗?

转载 作者:行者123 更新时间:2023-12-01 07:46:13 25 4
gpt4 key购买 nike

目前,我在 main 及其附近有这段代码:

import Control.Monad
import Control.Applicative

binSearch :: Ord a => [a] -> a -> Maybe Int

main = do
xs <- lines <$> readFile "Cars1.txt"
x <- getLine <* putStr "Registration: " -- Right?
putStrLn $ case binSearch xs x of
Just n -> "Found at position " ++ show n
Nothing -> "Not found"

我希望打印“Registration:”,然后让程序等待输入 x .我所写的是否意味着情况会如此?我需要 <* 吗? , 或者将 putStr上面一行中的表达式是否也能正常工作?

PS:我知道我必须转换 binSearch使用数组而不是列表(否则可能不值得进行二进制搜索),但这是另一天的问题。

最佳答案

线

x <- getLine <* putStr "Registration: "

从左到右对 IO 操作进行排序:首先将一行作为输入,然后打印消息,最后是变量 x绑定(bind)到 getLine 的结果.

Do I need the <*, or will putting the putStr expression on the line above make things work as well?

如果你想让消息在输入之前,你必须把putStr在上面一行,如下:

main :: IO ()
main = do
xs <- lines <$> readFile "Cars1.txt"
putStr "Registration: "
x <- getLine
putStrLn $ case binSearch xs x of
Just n -> "Found at position " ++ show n
Nothing -> "Not found"

或者,

    x <- putStr "Registration: " *> getLine

    x <- putStr "Registration: " >> getLine

会工作,但它们的可读性较差。

最后,由于您添加了 lazy-evaluation 标签,让我补充一点,您的问题实际上不是关于懒惰,而是关于运算符 <* 的方式。已定义,特别是关于它对 IO 操作进行排序的顺序。

关于haskell - 在这个例子中,我可以确定 IO 操作的顺序吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23619896/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com