C 什么是'#类型';在Haskell外部功能接口中是什么意思?

C 什么是'#类型';在Haskell外部功能接口中是什么意思?,c,haskell,types,ffi,preprocessor-directive,C,Haskell,Types,Ffi,Preprocessor Directive,我在Haskellsendfile包中找到了这段代码: 1) #type是什么意思?2)为什么会出现此错误 [1 of 1] Compiling Linux.Splice ( splice.hs, splice.o ) splice.hs:40:12: parse error on input `type' 当我自己尝试按如下方式使用它时: ghc --make splice.hs splice.hs: {-# LANGUAGE ForeignFunctionInterface

我在Haskell
sendfile
包中找到了这段代码:

1)
#type
是什么意思?2)为什么会出现此错误

[1 of 1] Compiling Linux.Splice     ( splice.hs, splice.o )

splice.hs:40:12: parse error on input `type'
当我自己尝试按如下方式使用它时:

ghc --make splice.hs
splice.hs:

{-# LANGUAGE ForeignFunctionInterface #-}

module Linux.Splice where

import Data.Word
import System.Posix.Types

-- SPLICE

 -- fcntl.h
 -- ssize_t splice(
 --   int          fd_in,
 --   loff_t*      off_in,
 --   int          fd_out,
 --   loff_t*      off_out,
 --   size_t       len,
 --   unsigned int flags
 -- );

foreign import ccall unsafe "fnctl.h splice" c_splice
  :: Fd
  -> Ptr (#type {- < parse error -} loff_t)
  -> Fd
  -> Ptr (#type loff_t)
  -> (#type size_t)
  -> Word
  -> IO (#type ssize_t)
{-#语言外来函数接口#-}
模块Linux.Splice在哪里
导入数据.Word
导入System.Posix.Types
--拼接
--fcntl.h
--交叉拼接(
--int fd_in,
--落下,
--int fd_out,
--离开,
--尺寸透镜,
--无符号整型标志
-- );
国外进口ccall不安全的“fnctl.h接头”c_接头
::Fd
->Ptr(#类型{-Fd
->Ptr(类型loff)
->(#字体大小#
->话
->IO(#类型ssize#t)

(使用GHC 7.4.x)

正如scdvvc所指出的,它使用由定义的C预处理宏来专门针对编译它的系统自定义代码。您需要使用
hsc2hs
来为您的代码定义适当的宏。

我应该指出,此外部导入不应标记为
不安全。当标记为
不安全
的外部函数阻塞时,它可以阻止其他线程运行(在使用GHC编译的程序中,使用
-线程
)。@joey adams Oh非常感谢您指出这一点!我正在为我的代理服务器开发一个完善的网络套接字管道拼接实现。我希望在Linux上使用它,而不是读/写循环,目前我仍将在其他操作系统上使用它
{-# LANGUAGE ForeignFunctionInterface #-}

module Linux.Splice where

import Data.Word
import System.Posix.Types

-- SPLICE

 -- fcntl.h
 -- ssize_t splice(
 --   int          fd_in,
 --   loff_t*      off_in,
 --   int          fd_out,
 --   loff_t*      off_out,
 --   size_t       len,
 --   unsigned int flags
 -- );

foreign import ccall unsafe "fnctl.h splice" c_splice
  :: Fd
  -> Ptr (#type {- < parse error -} loff_t)
  -> Fd
  -> Ptr (#type loff_t)
  -> (#type size_t)
  -> Word
  -> IO (#type ssize_t)