gpt4 book ai didi

haskell - CString 可以是 IsString、Show 的实例吗?

转载 作者:行者123 更新时间:2023-12-04 13:26:39 25 4
gpt4 key购买 nike


newCString :: String -> IO CString
peekCString :: CString -> IO String

你需要
fromString :: String -> a
show :: a -> String

我蹩脚的尝试
{-# LANGUAGE TypeSynonymInstances #-}
{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE OverlappingInstances #-}

module Main where

import Data.String
import Foreign.C.String
import System.IO.Unsafe

instance IsString CString where
fromString = unsafePerformIO . newCString

instance {-# OVERLAPS #-} Show CString where
show = unsafePerformIO . peekCString

mycs :: CString
mycs = "hello CString"

main = putStrLn $ show mycs

它似乎工作。但是,从来没有说过 unsafePerformIO在我想知道我在这里设置什么样的灾难之前?我是否泄漏了内存?有没有一种安全的方法来实现这种便利?

最佳答案

没有。您的 show例如,函数将为相同的 CString 返回不同的结果。不同时期的值(value)。这是因为 CString实际上是一个可变字符串,相当于 IORef String .因为 Haskell 语言没有指定表达式的计算时间和计算次数,所以表达式 show cs使用你的实例会有一个不确定的值,所以大多数 Haskell 程序员会说这不是 unsafePerformIO 的有效使用。 ,并且(有意)不可能实现 Show CString不使用 unsafePerformIO .

关于haskell - CString 可以是 IsString、Show 的实例吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31619769/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com