我通过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
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
为什么在我的函数定义中会出现这样的错误?
答案 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"