我正在尝试使用.Net库中的WriteAllLines将字符串列表写入文件。 我在最后一行收到错误
“在此之后阻止未完成。期待表达。” 我现在看了一个小时,找不到任何东西。有人可以帮忙吗?
let rec ConvertToString list =
match list with
| [l] -> l.ToString()
| head :: tail -> head.ToString() + ConvertToString tail
| [] -> ""
let rec WriteImage(filepath:string, width:int, height:int, depth:int, image:int list list) =
if image = [] then
System.IO.File.WriteAllLines(filepath, L)
true // success
else
let L = ConvertToString(image.Head) :: WriteImage(filepath, width, height, depth, image.Tail)
答案 0 :(得分:0)
F#代码块是表达式,它们不能用let绑定赋值完成,这是编译器告诉你的第一件事。
在F#中,所有函数都是表达式,它们应该返回一些东西,你可以通过返回单位值()
使代码返回任何内容,这样你就可以删除最后一行中的let L =
,它会使感觉,否则你用L
做什么?这是最后一行。
但除此之外你还有更多错误:
在最后一行中,您尝试列出一个字符串,并对函数的rec调用进行连接,该函数返回一个布尔值。您不能将字符串与布尔值连接起来。字符串可以与字符串列表连接。因此,您需要使用空字符串初始调用其他参数。
WriteAllLines接受数组,而不是列表,您需要添加转换。
你说你不想返回任何东西,这是有道理的但是在第一个分支中你返回true
没有意义且不会打字检查,只需删除该行。
在函数ConvertToString的匹配中的第一种情况,它试图将单个元素列表转换为字符串。你不需要那个案子,其他两个案件就足够了。
这些修改后的代码:
let rec ConvertToString list =
match list with
//| [l] -> l.ToString()
| head :: tail -> head.ToString() + ConvertToString tail
| [] -> ""
let rec WriteImage strList (filepath:string, width:int, height:int, depth:int, image:int list list) =
if image = [] then
System.IO.File.WriteAllLines(filepath, List.toArray strList)
// true // success
else
WriteImage (ConvertToString(image.Head)::strList) (filepath, width, height, depth, image.Tail)
// then you call your function this way
WriteImage "" (filepath, width, height, depth, image)
另外一件事,参数宽度,高度,深度不会在函数体中起任何作用,你可以将它们全部删除。
最后,如果你正在学习它是一个很好的练习,以便熟悉递归作为第一步,但实际上在这种情况下你根本不需要它,因为你可以使用更高阶函数,如{ {1}}。您的代码可以像这样重写:
List.map