gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 16:12:57 25 4
gpt4 key购买 nike

我用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

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

最佳答案

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

所以通过做

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

您要告诉 F# 打印 三个整数(由“,”分隔)- 您可以认为它的类型是 printf "%i,%i,%i": int -> int -> int -> unit - 但你给它一个元组 int*int*int (即 fangle 的评估结果 a=3, b=4, c=5) 所以现在 F# 正在尝试找出如何匹配 printf "%i,%i 中的第一个柯里化(Currying)类型 int ,%i" 类型为 int*int*int 而我不能 - 因此出现错误。

显而易见的解决方法是:

printfn "%A" (fangle 3 4 5)

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

> printfn "%A" (fangle 3 4 5);;
(4, 5, 6)
val it : unit = ()

或者你可以先解构元组:

> let (x,y,z) = fangle 3 4 5 in printfn "%i,%i,%i" x y z;;
4,5,6
val it : unit = ()

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

let uncurry3 f (x,y,z) = f x y z

> uncurry3 (printfn "%i,%i,%i") (fangle 3 4 5);;
4,5,6
val it : unit = ()

关于返回元组的函数的 F# 项目编译错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30389597/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com