Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
递归循环中的Haskell-Branch执行除所选分支之外的所有先前访问的分支_Haskell_Io - Fatal编程技术网

递归循环中的Haskell-Branch执行除所选分支之外的所有先前访问的分支

递归循环中的Haskell-Branch执行除所选分支之外的所有先前访问的分支,haskell,io,Haskell,Io,我试图通过做来学习一些Haskell,但遇到了一个我甚至不知道如何解释的问题。 问题是一些代码,允许用户选择访问菜单选项的顺序,并在确认之前随时更改选项。第一个选项会顺利进行,相同选项的后续选择也会顺利进行,但一旦做出不同的选择,从该点开始的每个循环,无论输入的是1还是2,都会在函数modeSelectParse中执行这两个选项(请参见下面的代码)。这些分支是程序中对gatherSettings或mart的唯一调用,即使它们都被截短为一个print语句,这种行为仍然存在 当我添加更多分支时,以前

我试图通过做来学习一些Haskell,但遇到了一个我甚至不知道如何解释的问题。 问题是一些代码,允许用户选择访问菜单选项的顺序,并在确认之前随时更改选项。第一个选项会顺利进行,相同选项的后续选择也会顺利进行,但一旦做出不同的选择,从该点开始的每个循环,无论输入的是1还是2,都会在函数modeSelectParse中执行这两个选项(请参见下面的代码)。这些分支是程序中对gatherSettings或mart的唯一调用,即使它们都被截短为一个print语句,这种行为仍然存在

当我添加更多分支时,以前访问过的所有分支在每次迭代中都会运行一次,始终以固定的顺序运行,而不管我在modeSelectParse中围绕分支的顺序移动,或者哪个数字对应于哪个选项

我怀疑stdin缓冲有问题,所以我试着关闭它,并对输入进行了各种其他测试。但是当我尝试在程序中的不同点打印数据时,数据似乎没有任何问题

对modeSelectInit的初始调用也不会出现多次调用的情况

如果需要,我可以给出更多的解释和代码

modeSelectInit::DatabaseStruct->IO(IO设置、IO顺序)
modeSelectInit db=do
putStrLn“大量文本”
hFlush stdout
让选择=(返回清空设置,返回[])
输入(IO设置,IO顺序)->IO(IO设置,IO顺序)
modeSelect db select=do
设置(IO设置、IO顺序)
modeSelectParse数据库“1”(u,o)=(gatherSettings,o)
modeSelectParse数据库'2'(s,)=(s,mart数据库)
等待字符::[Char]->IO字符 等待chars=do 输入[Char]->IO字符 awaitChar2[]字符=awaitChar字符 awaitChar2(x:u)chars=ifthenels(x`elem`chars)(返回x)(awaitcharchars)
IO
操作作为参数传递和返回嵌套的
IO
操作都是非常不寻常的。(当然,在某些情况下,这正是所需要的,但这并不是在99%的标准、普通、日常的Haskell中。)我怀疑只要消除这种奇怪现象就可以解决你的问题。因此,请尝试以下类型签名:

modeSelectInit :: DatabaseStruct -> IO (Settings, Order)
modeSelect :: DatabaseStruct -> (Settings, Order) -> IO (Settings, Order)
modeSelectParse :: DatabaseStruct -> Char -> (Settings, Order) -> IO (Settings, Order)

它们的实现将需要稍微调整以进行补偿,但从我在这里看到的情况来看,我怀疑您大致知道如何做到这一点。(但如果这感觉很难,那么一定要说——这里的许多人都会很高兴地说,如果你发现自己被卡住了,你会怎么办!)

谢谢!这确实解决了问题。该项目包含了多次IO操作,因为早期我对如何有效地从IO元组中获取数据缺乏了解,但一旦我清除了所有这些操作,它就可以完美地运行:)
modeSelectInit :: DatabaseStruct -> IO (Settings, Order)
modeSelect :: DatabaseStruct -> (Settings, Order) -> IO (Settings, Order)
modeSelectParse :: DatabaseStruct -> Char -> (Settings, Order) -> IO (Settings, Order)