“阻止跟随此'让'未完成”错误f#

时间:2015-02-25 03:42:54

标签: f#

我正在尝试使用.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)

1 个答案:

答案 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