【问题标题】:Why does this F# function need the extra sprintf to compile?为什么这个 F# 函数需要额外的 sprintf 来编译?
【发布时间】:2014-04-27 01:34:03
【问题描述】:

我是 F# 菜鸟。我正在尝试创建一个函数来格式化结果元组,其中最后一个元素可能存在也可能不存在 - 因为它旨在保存在处理过程中可能捕获的任何异常。

let formatResults resultsTuple =
  match resultsTuple with
  |(name1, name2, diff, count, correlation, None) -> (sprintf "%A and %A with diff %A had %A pairs and showed a correlation coefficient of %A" name1 name2 diff count correlation)
  |(name1, name2, diff, _, _, Some(ex)) -> (sprintf "Error: %A and %A with diff %A threw exception %A" name1, name2, diff, ex) |> sprintf "%A"

在最后一行看到我如何将第一个 sprintf 的结果通过管道传输到第二个 sprintf 中?基本上,它告诉我我在某个地方遇到了语法错误,并且程序没有按照我的想法执行。 (初步测试似乎给出了合理的输出,但这让我感到紧张。)

为什么可以编译,但不能编译?它给了我编译错误“这个表达式应该有类型字符串,但这里有类型'a *'b *'c *'d”。

let formatResults resultsTuple =
  match resultsTuple with
  |(name1, name2, diff, count, correlation, None) -> sprintf "%A and %A with diff %A had %A pairs and showed a correlation coefficient of %A" name1 name2 diff count correlation
  |(name1, name2, diff, _, _, Some(ex)) -> sprintf "Error: %A and %A with diff %A threw exception %A" name1, name2, diff, ex

【问题讨论】:

    标签: f#


    【解决方案1】:
    sprintf "Error: %A and %A with diff %A threw exception %A" name1, name2, diff, ex
    

    您正在创建一个元组,其中包含sprintf "..." name1 返回的函数作为其第一个元素。元组的其他元素是name2diffex。通过将该元组传递给sprintf "%A",您将其转换为字符串,使类型工作。但当然,这仍然不会让它做你想做的事。

    做你想做的事,去掉逗号。

    【讨论】:

    • 就是这样。我知道这一定是一件非常简单的事情。谢谢。
    猜你喜欢
    • 2017-01-10
    • 1970-01-01
    • 1970-01-01
    • 2015-08-24
    • 1970-01-01
    • 2010-09-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多