Haskell在文件中写一个列表,稍后再读取

Haskell在文件中写一个列表,稍后再读取,haskell,Haskell,我试图将一个列表写入一个文件,稍后我还想将文件内容读入列表 所以我有一个这样的列表[“ABC”,“DEF”] 我试过类似的方法 hPrint fileHandle listName 这只是打印到文件“[“ABC”,“DEF”]” 我曾尝试过取消线,但这就像“ABC\nDEF\n” 现在在这两种情况下,我都无法读回正确的列表。输出文件有引号,因此当我读取时,我得到如下[“[”ABC“,”DEF“]”即列表中的单个字符串 由于我在这方面没有成功,我尝试一行一行地编写列表,我尝试应用映射和函数来编写

我试图将一个列表写入一个文件,稍后我还想将文件内容读入列表

所以我有一个这样的列表[“ABC”,“DEF”]

我试过类似的方法

hPrint fileHandle listName
这只是打印到文件
“[“ABC”,“DEF”]”

我曾尝试过
取消线
,但这就像
“ABC\nDEF\n”

现在在这两种情况下,我都无法读回正确的列表。输出文件有引号,因此当我读取时,我得到如下[“[”ABC“,”DEF“]”即列表中的单个字符串

由于我在这方面没有成功,我尝试一行一行地编写列表,我尝试应用映射和函数来编写列表
k=map(\x->hPrint fileSLC x)字段。在
之前,它没有做任何事情,文件是空的。我想如果我把所有内容都写在单独的行中,我以后将能够像
(lines src)
一样阅读


我知道我所做的一切都是错误的,但我只是第二次在Haskell上编写代码,上一次我只是编写了一个非常小的文件读取程序。从命令式转换为函数式并不容易(

正如您所看到的,当您从文件中读取时,会得到一个
字符串
。要将该
字符串
转换为列表,您需要对其进行解析


对于
k=map(\x->hPrint fileSLC x)字段,在
工作之前,您需要使用
mapM
mapM
,而不是您已经看到的
map

,当您从文件读取时,您会得到一个
字符串。为了将该
字符串转换为列表,您需要对其进行解析


对于
k=map(\x->hPrint fileSLC x)字段,在
工作之前,您需要使用
mapM
mapM
,而不是您已经看到的
map

,当您从文件读取时,您会得到一个
字符串。为了将该
字符串转换为列表,您需要对其进行解析


对于
k=map(\x->hPrint fileSLC x)字段,在
工作之前,您需要使用
mapM
mapM
,而不是您已经看到的
map

,当您从文件读取时,您会得到一个
字符串。为了将该
字符串转换为列表,您需要对其进行解析


对于
k=map(\x->hPrint fileSLC x)字段在工作之前,您需要使用
mapM
mapM
而不是
map

尝试使用
hPutStrLn
unlines
而不是
hPrint
hPrint
内部调用
show
,这会导致
字符串被引用和转义

hPutStr fileHandle (unlines listName)
或者,使用
mapM
表单
。详细示例如下:

forM_ listName $ \string ->
   hPutStrLn string
这可以简化为(lambda演算术语中的“eta合同”)


尝试使用
hPutStrLn
unlines
代替
hPrint
hPrint
内部调用
show
,这会导致
字符串被引用和转义

hPutStr fileHandle (unlines listName)
或者,使用
mapM
表单
。详细示例如下:

forM_ listName $ \string ->
   hPutStrLn string
这可以简化为(lambda演算术语中的“eta合同”)


尝试使用
hPutStrLn
unlines
代替
hPrint
hPrint
内部调用
show
,这会导致
字符串被引用和转义

hPutStr fileHandle (unlines listName)
或者,使用
mapM
表单
。详细示例如下:

forM_ listName $ \string ->
   hPutStrLn string
这可以简化为(lambda演算术语中的“eta合同”)


尝试使用
hPutStrLn
unlines
代替
hPrint
hPrint
内部调用
show
,这会导致
字符串被引用和转义

hPutStr fileHandle (unlines listName)
或者,使用
mapM
表单
。详细示例如下:

forM_ listName $ \string ->
   hPutStrLn string
这可以简化为(lambda演算术语中的“eta合同”)



你刚刚救了我一天。非常感谢:):)还有一件事,你知道我如何从用户那里输入列表吗?再次感谢。@AbhinavSingh如果你想从stdin中读取Haskell格式的列表,你可以使用
readLn
。你刚刚救了我一天。非常感谢:):)还有一件事,你知道我如何从用户那里输入列表吗?再次感谢。@AbhinavSingh如果你想读取Haskell f格式的列表从stdin开始,你可以使用
readLn
。你刚刚救了我一天。非常感谢:):)还有一件事,你知道我如何从用户那里输入列表吗?再次感谢:。@AbhinavSingh如果你想从stdin开始阅读Haskell格式的列表,你可以使用
readLn
。你刚刚救了我一天。非常感谢:):)还有一件事,你知道我该怎么做吗放置用户的列表?再次感谢。:@AbhinavSingh如果您想从stdin读取Haskell格式的列表,可以使用
readLn
。如果您需要存储/还原数据类型,您正在寻找数据序列化。如果您使用GHC,则有一个名为的库存包,它可以直接执行所有这些操作,包括对fil的序列化e、 大多数常见类型都已经得到了支持,您自己的类型可以通过编写自定义数据轻松添加。二进制实例。您好David,谢谢您的回复。我不能使用serailization,因为我正在编写的文件将通过人眼进行评估,因为这是一个学校项目。因此我只需要保留简单的文本。另一方面,一个你知道如何从用户那里输入列表吗?再次感谢你。:)只需根据用户输入的值创建一个列表。你可以解析输入,也可以不解析输入,这取决于输入的执行方式。请注意haskell中的基本列表是同质的。是的,实际上我不知道如何迭代用户输入并存储到列表中。与haskell在一起的第三天:-你在深入研究之前需要学习。尝试一下。显而易见的方法是使用递归而不是迭代。只需编写一个IO函数来处理输入,包括一种termi方法