类型之间的Haskell转换

时间:2018-11-29 12:18:52

标签: haskell types type-conversion

再次坚持可能是理论上的东西。 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是书籍与现实世界之间的粘合剂。

1 个答案:

答案 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 -也就是说,如果无法解析输入,它将崩溃。 最后,如果您以这种方式保留数据,则将受制于这种记录格式,并且永远无法更改。

对于生产质量的解决方案,很抱歉,但是您必须提出一个明确的,已记录的序列化格式。不可能解决-用任何语言。