如何将haskell[char]转换为CString

如何将haskell[char]转换为CString,c,haskell,C,Haskell,我在haskell中的代码有一些错误: 无法将类型“[Char]”与“Ptr CChar”匹配 预期类型:CString 实际类型:[Char] 源代码: {-# LANGUAGE ForeignFunctionInterface #-} module Main where import Foreign.C -- get the C types import Foreign.Ptr (Ptr,nullPtr) import Foreign.C.String foreign import cc

我在haskell中的代码有一些错误: 无法将类型“[Char]”与“Ptr CChar”匹配 预期类型:CString 实际类型:[Char]

源代码:

{-# LANGUAGE ForeignFunctionInterface #-}
module Main where

import Foreign.C -- get the C types
import Foreign.Ptr (Ptr,nullPtr)
import Foreign.C.String

foreign import ccall "stdio.h printf"
  myprintf :: CString -> IO CString

main = do
  myprintf "hello"
文本
“hello”
的类型为
String
(也称为
[Char]
),而不是
CString
,因此无法将其传递给
myprintf
。类型不匹配

您可以通过以下方式将其转换为
CString

main=do

C中的str
printf
是一个可变函数,我不确定我们是否可以如此轻松地导入它,忽略参数的可变部分。也许我们可以使用
ccall
。此外,我认为必须手动释放
CString
(?),问题是将
String
转换为
CString
不是一个纯粹的操作。@FyodorSoikin啊,对。我把这种情况与别名类型已经有实例的情况混淆了,在这种情况下,别名不足以创建单独的实例。为什么
“stdio.h printf”
而不是
“printf”
?在一些示例中,我看到了这种做法
main = do
    str <- newCString "hello"
    myprintf str
main =
    myprintf =<< newCString "hello"