gpt4 book ai didi

ocaml - 为什么编译器不能匹配这个函数类型?

转载 作者:行者123 更新时间:2023-12-01 02:20:28 35 4
gpt4 key购买 nike

我的 OCaml 编译器有问题,我无法解释。以下代码无法编译:

open Postgresql

let get_nodes conn =
ignore (conn#exec "SELECT * FROM node_full")

let () =
let c = new connection () in
ignore (get_nodes c)

它给出了以下错误:
File "test.ml", line 8, characters 20-21:
Error: This expression has type Postgresql.connection
but an expression was expected of type < exec : string -> 'a; .. >
Types for method exec are incompatible

(第8行是最后一行)

但是下面的代码编译没有错误(并且在代码的完整版本中按预期工作):
open Postgresql

let get_nodes (conn:connection) =
ignore (conn#exec "SELECT * FROM node_full")

let () =
let c = new connection () in
ignore (get_nodes c)

唯一的区别是我在 get_nodes 函数中指定了 conn 参数的类型。

有人明白这里发生了什么吗?这是我第一次必须自己指定类型才能使代码工作,而且我是 OCaml 的日常用户......

另外,我在错误消息中没有看到为什么所涉及的类型不兼容,这里是 exec 函数的类型:
method exec :
?expect:Postgresql.result_status list ->
?params:string array ->
?binary_params:bool array ->
string -> Postgresql.result

以及来自 Postgresql.result 的 get_all 函数的类型:
method get_all : string array array

新年快乐 !

最佳答案

嗯,nlucaroni 指出,这已经在 Optional argument in a method with ocaml 以更简单的形式得到了回答。 ,但这里是我通过阅读该页面获得的内容的简短描述。

您调用 exec给它推断类型 string -> 'a .这完全不像 exec 的类型Postgresql 连接的方法,它有三个可选参数。修复它的一种方法是执行您所做的操作:声明 conn 的类型范围。您也可以只声明 exec 的可选参数。方法,也许是这样的:

ignore (
(conn#exec :
?expect: 'a ->
?params: 'b ->
?binary_params: 'c ->
string -> 'd) "SELECT * FROM node_full"
)

关于ocaml - 为什么编译器不能匹配这个函数类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20859676/

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