gpt4 book ai didi

f# - 如何将 printf 样式的函数传递给 F# 中的另一个函数

转载 作者:行者123 更新时间:2023-12-01 06:45:05 26 4
gpt4 key购买 nike

我想在 F# 中创建一个函数,该函数接受 printf 样式的函数作为参数,并使用该参数输出数据。用法如下所示:

OutputStuff printfn

我的第一次尝试是让编译器为我解决所有问题:
let OutputStuff output =
output "Header"
output "Data: %d" 42

那失败了,因为它决定 output是一个函数取 string并返回 unit ,所以第二次调用失败。

接下来我尝试声明 output具有与 printfn 相同的签名:
let OutputStuff (output : Printf.TextWriterFormat<'a> -> 'a) =
output "Header"
output "Data: %d" 42

这将失败,因为编译器决定 output 的真实类型是 Printf.TextWriterFormat<string> -> unit ,所以第二次调用再次失败。它还生成警告 FS0064,指示第一次调用 output导致代码不如类型注释通用,这是这里问题的症结所在。

最后,我尝试将输出函数声明为单独的类型缩写:
type OutputMe<'a> = Printf.TextWriterFormat<'a> -> 'a
let OutputStuff (output : OutputMe<'a>) =
output "Header"
output "Data: %d" 42

这失败了,结果与之前的尝试相同。

我如何说服编译器不专门化 output 的类型并将其保留为 Printf.TextWriterFormat<'a> -> 'a ?

最佳答案

问题是当你说(output : Printf.TextWriterFormat<'a> -> 'a) ,这意味着“ 一些 'a 其输出需要 Printf.TextWriterFormat<'a>'a ”。相反,您想说的是“ 对于所有 'a 输出可以采用 Printf.TextWriterFormat<'a> 并返回 'a

这在 F# 中表达有点难看,但实现的方法是使用具有泛型方法的类型:

type IPrinter =
abstract Print : Printf.TextWriterFormat<'a> -> 'a

let OutputStuff (output : IPrinter) =
output.Print "Header"
output.Print "Data: %d" 42

OutputStuff { new IPrinter with member this.Print(s) = printfn s }

关于f# - 如何将 printf 样式的函数传递给 F# 中的另一个函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15884703/

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