2014-04-27 93 views
0

我是F#noob。我试图创建一个函数来格式化结果元组,最后一个元素可能存在也可能不存在 - 因为它旨在保存在处理过程中可能被捕获的任何异常。为什么这个F#函数需要额外的sprintf来编译?

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 

回答

2
sprintf "Error: %A and %A with diff %A threw exception %A" name1, name2, diff, ex 

你创建一个包含sprintf "..." name1作为它的第一个元素返回功能的元组。元组的其他元素是name2,diffex。通过将该元组传递给sprintf "%A",可以将它变成一个字符串,从而使这些类型有效。但当然,这仍然不会让它做你想做的事。

做你想做什么,摆脱逗号。

+0

就是这样。我知道它必须是简单可笑的东西。谢谢。 – speckledcarp

相关问题