再次坚持可能是理论上的东西。 Haskell中有很多库,我想尽量减少使用。如果我有这样的类型:
data Note = Note { _noteID :: Int
, _noteTitle :: String
, _noteBody :: String
, _noteSubmit :: String
} deriving Show
并使用它来创建[Note {noteID=1...}, Note {noteID=2...}, ]
等的列表。我现在有一个类型Note
的列表。现在,我想使用writeFile
将其写入文件。考虑到writeFile的类型为FilePath -> String -> IO ()
,ghc可能不允许它。但是我也想避免一直解构(writeFile)和构造(readFile)类型,假设我不会离开Haskell的“领域”。有没有一种方法,而无需使用特殊的库?再次:非常感谢。 Haskell上的书籍不错,但StackOverflow是书籍与现实世界之间的粘合剂。
答案 0 :(得分:3)
如果您正在寻找“快速修复”,一次性脚本或类似内容,则除了Read
之外,还可以导出Show
,然后您就可以使用show
转换为String
并使用read
转换回来,例如:
data D = D { x :: Int, y :: Bool }
deriving (Show, Read)
d1 = D 42 True
s = show d1
-- s == "D {x = 42, y = True}"
d2 :: D
d2 = read s
-- d2 == d1
但是,请请不要将其放在生产代码中。 首先,您隐式地依赖于记录的编码方式,并且没有任何检查可以防止微妙的更改。 第二, read
函数是 partial -也就是说,如果无法解析输入,它将崩溃。 最后,如果您以这种方式保留数据,则将受制于这种记录格式,并且永远无法更改。
对于生产质量的解决方案,很抱歉,但是您必须提出一个明确的,已记录的序列化格式。不可能解决-用任何语言。