返回元组的函数的F#项目编译错误

时间:2015-05-22 06:16:46

标签: f# return tuples

我通过visual studio创建了一个F#项目,增加了这样的功能:

let fangle a b c =
  a+1, b+1, c+1

[<EntryPoint>]
let main argv = 
printfn "%i,%i,%i" (fangle 3 4 5) // compile error

在调用(fangle 3 4 5)时出现编译错误,它说:

Error 2 The type '(int * int * int)' is not compatible with any of the types
byte,int16,int32,int64,sbyte,uint16,uint32,uint64,nativeint,unativeint,
arising from the use of a printf-style format string 
C:\Users\mis\Documents\Visual Studio 2013\Projects\ConsoleApplication1\ConsoleApplication3\Program.fs 20 25 ConsoleApplication3

为什么在我的函数定义中会出现这样的错误?

2 个答案:

答案 0 :(得分:7)

这不是你的函数定义 - 它是你使用printfn的方式(F#编译器确实在检查你是否使用了给定格式字符串的正确参数)。

通过做

printfn "%i,%i,%i" (fangle 3 4 5)

你告诉F#打印三个整数(用','分隔) - 你可以认为它的类型是printf "%i,%i,%i" : int -> int -> int -> unit - 但你给它一个元组{{1} }(即评估int*int*int的{​​{1}}的结果)所以现在F#正在尝试弄清楚如何匹配fangle中第一个curried类型a=3, b=4, c=5和类型{{ 1}}我不能 - 因此错误。

明显的解决办法是:

int

你告诉F#格式化生成的元组:

printf "%i,%i,%i"

或者你可以先解构元组:

int*int*int

或者你可以去弹道/幻想;)

printfn "%A" (fangle 3 4 5)

答案 1 :(得分:7)

除了Carsten在他的回答中已经说过的话,你还可以使用pipe-operator |||>来解构元组,同时将它们作为参数传递给另一个函数:

let fangle a b c =
    a+1, b+1, c+1

[<EntryPoint>]
let main argv = 
    fangle 3 4 5
    |||> printfn "%i,%i,%i"