小编xyz*_*zyz的帖子

为newtype创建MonadBaseControl实例

假设我有简单的newtype声明

newtype Foo a = Foo { unFoo :: ReaderT Int IO a }
Run Code Online (Sandbox Code Playgroud)

我想制作MonadBaseControl IO的Foo实例.它应该很简单,因为ReaderT Int IO已经是MonadBaseControl IO的一个实例.但是,使用GeneralizedNewtypeDeriving自动派生它不起作用,因为MonadBaseControl类具有关联类型.

如何为Foo编写MonadBaseControl IO实例?defaultLiftBaseWith和defaultRestoreM应该会有所帮助,但要解密它们的类型有点困难.

haskell monad-transformers

14
推荐指数
1
解决办法
712
查看次数

为什么 file_operations 中的 unlocked_ioctl 返回 long,而 sys/ioctl.h 中的 ioctl() 返回 int?

struct file_operations 中的unlocked_ioctl 的签名是

long (*unlocked_ioctl) (struct file *, unsigned int, unsigned long);
Run Code Online (Sandbox Code Playgroud)

而 man 2 ioctl 说 ioctl(2) 的签名是:

int ioctl(int d, int request, ...);
Run Code Online (Sandbox Code Playgroud)

我知道参数在内核内部是如何被破坏的,但是为什么内核空间中的返回类型是long,而用户空间中的返回类型却是int?当我想返回一个负值作为错误时,这会产生一个问题:由于二补码编码,我返回的所有负值都会变成 -1。

c unix ioctl linux-device-driver linux-kernel

2
推荐指数
1
解决办法
2267
查看次数