在Linux上读取ghci中的stdin已中断

在Linux上读取ghci中的stdin已中断,linux,bash,haskell,Linux,Bash,Haskell,从Windows开始,我最近通过bash(ghc 7.10)安装了名为Peppermint和Haskell Platform的linux发行版,但ghci中的ghci stdin肯定有问题,因为: interact$take 0 抛出错误,但 interact$take 1 没有 此外,如果在写入stdin时使用退格、箭头或任何其他控制按钮,则会输入字符符号。例如,backspace将^?输入ghci,而不是删除最后键入的字符 …@…~$ghci GHCi,7.10.3版:http://www.

从Windows开始,我最近通过bash(ghc 7.10)安装了名为Peppermint和Haskell Platform的linux发行版,但ghci中的ghci stdin肯定有问题,因为:

interact$take 0
抛出错误,但
interact$take 1
没有

此外,如果在写入stdin时使用
退格
箭头
或任何其他控制按钮,则会输入字符符号。例如,backspace
^?
输入ghci,而不是删除最后键入的字符

…@…~$ghci
GHCi,7.10.3版:http://www.haskell.org/ghc/  :? 求救
序曲>互动$take 0
序曲>
:hGetChar:非法操作(句柄已关闭)
...@... ~ $ ghci
GHCi,7.10.3版:http://www.haskell.org/ghc/  :? 求救
前奏曲>readLn::IO字符串
euoe^^^[[1;5C^[[D^[[B]这里我试图删除“euoe”

关于控制代码文本,这是因为您已经设法避开了通常会解释按键的所有行编辑器(readline、Haskeline)

我不知道具体细节,但调用GHCi类似于使用
bash--noediting
启动子shell。这允许GHCi在不受readline库干扰的情况下接收原始按键。之所以这样做,是因为GHCi用来代替readline的Haskeline可以配置为tab completion之类的功能ble功能更容易实现(您知道GHCi提供了制表符完成功能,对吧?)

从GHCi调用
getLine
,然后直接进入stdin,有效地穿过活板门,完全避开了Haskeline。毕竟,只有一个stdin。您现在直接在无缓冲的终端中键入

回到您的第一个问题,只有一个stdin也是GHCi在打印
Prelude>
提示后立即停止的原因。
interact
(在后台使用
hGetContents
)声称它将处理所有通过句柄(stdin)的输入作为一个大的惰性
字符串
。实际上,
交互
尚未声明要处理的句柄上不可能有剩余的输入,因此句柄立即进入“半关闭”状态。它不是关闭的(可能还有更多的输入将作为惰性
字符串的一部分被读取,但它对任何新来者都是封闭的,否则输入将被复制(
interact
,句柄的新读取器,如
getLine
将获得相同的行!)


回到GHCi,在使用了
interact
之后,stdout仍然很好,因此提示符像往常一样打印出来,然后GHCi依靠Haskeline返回一行进行处理。Haskeline(作为行编辑器)调用阻塞
getChar
(iirc)向行中添加一个字符或执行一些行编辑命令,因为它正在寻址一个半封闭的句柄而死亡。因此,一个较弱的生物确实会倒下,生命之轮继续转动。

关于控制代码文字,这是因为您已设法逃脱所有行编辑器(readline,Haskeline)这通常会解释你的按键

我不知道具体细节,但调用GHCi类似于使用
bash--noediting
启动子shell。这允许GHCi在不受readline库干扰的情况下接收原始按键。之所以这样做,是因为GHCi用来代替readline的Haskeline可以配置为tab completion之类的功能ble功能更容易实现(您知道GHCi提供了制表符完成功能,对吧?)

从GHCi调用
getLine
,然后直接进入stdin,有效地穿过活板门,完全避开了Haskeline。毕竟,只有一个stdin。您现在直接在无缓冲的终端中键入

回到您的第一个问题,只有一个stdin也是GHCi在打印
Prelude>
提示后立即停止的原因。
interact
(在后台使用
hGetContents
)声称它将处理所有通过句柄(stdin)的输入作为一个大的惰性
字符串
。实际上,
交互
尚未声明要处理的句柄上不可能有剩余的输入,因此句柄立即进入“半关闭”状态。它不是关闭的(可能还有更多的输入将作为惰性
字符串的一部分被读取,但它对任何新来者都是封闭的,否则输入将被复制(
interact
,句柄的新读取器,如
getLine
将获得相同的行!)


回到GHCi,在使用了
interact
之后,stdout仍然很好,因此提示符像往常一样打印出来,然后GHCi依靠Haskeline返回一行进行处理。Haskeline(作为行编辑器)调用阻塞
getChar
(iirc)要么在行中添加一个字符,要么执行一些行编辑命令,然后死亡,因为它正在处理一个半封闭的句柄。因此,一个较弱的生物确实会倒下,生命之轮继续转动。

你如何运行该程序?还有,你期望发生什么?GHCI似乎会执行任何传入的命令,所以我不确定你是否能够继续运行该程序e-read stdin。这似乎与您的问题有关:
interact
和GHCi的混合不好,IIRC。
interact
自己想要所有的stdin,而GHCi无法取回。@villou24不太可能,因为我没有两次尝试从stdin中读取。@FordO。建议您隐式地尝试从stdin中读取两次,一次用于重新读取PL(ghci)和一次用于显式的
交互
调用。您是如何运行该程序的?您希望发生什么?ghci似乎执行任何传入的操作,因此我
...@... ~ $ ghci
GHCi, version 7.10.3: http://www.haskell.org/ghc/  :? for help
Prelude> interact $ take 0
Prelude> 
<stdin>: hGetChar: illegal operation (handle is closed)
...@... ~ $ ghci
GHCi, version 7.10.3: http://www.haskell.org/ghc/  :? for help
Prelude> readLn :: IO String 
euoe^?^?^[[1;5C^[[D^[[B -- here I tried to delete 'euoe'