将FD转换为Handle

Imp*_*ive 4 linux haskell tty

我想打开一个伪tty,并使用生成的从属终端连接到子进程上的stdin / stdout。openPseudoTerminal给我一个IO (System.Posix.Types.Fd, System.Posix.Types.Fd),我试图将其转化为一对句柄(特定fdToHandleGHC.IO.Handle.FdGHC,但我找不到其他这样的函数)。但是,我得到以下信息:

liftA (fdToHandle *** fdToHandle) openPseudoTerminal
Couldn't match type `System.Posix.Types.Fd'
               with `System.Posix.Internals.FD'
Run Code Online (Sandbox Code Playgroud)

有什么想法可以在这两个(大概相似)的事物之间转换吗?

对于奖励积分,这将给我IO (IO Handle, IO Handle)-是否有一种巧妙的方法可以将其转换为IO (Handle, Handle)

ray*_*nad 5

openPseudoTerminal在Unix软件包中,该软件包还在中提供了fdToHandle具有适当类型的System.Posix.IO

我将使用到目前为止我提出的最好的单线处理这对IO Handles:

getHandles :: IO (Handle, Handle)
getHandles =
  openPseudoTerminal >>= uncurry ap . (fmap (,) . fdToHandle *** fdToHandle)
Run Code Online (Sandbox Code Playgroud)

要么:

getHandles =
  openPseudoTerminal >>= uncurry (ap . fmap (,)) . join (***) fdToHandle
Run Code Online (Sandbox Code Playgroud)