gpt4 book ai didi

ocaml - 无法输入多态 [%bs.raw 函数

转载 作者:行者123 更新时间:2023-12-01 08:26:30 25 4
gpt4 key购买 nike

1) 有没有办法输入这个? 2)谁能解释一下这些错误消息?

let identity1: 'a => 'a = [%bs.raw {|
function(value) {
return value
}
|}];

/*
Line 2, 11: The type of this expression, '_a -> '_a, contains type variables that cannot be generalized
*/

let identity2: 'a. 'a => 'a = [%bs.raw {|
function(value) {
return value
}
|}];

/*
Line 8, 11: This definition has type 'a -> 'a which is less general than 'a0. 'a0 -> 'a0
*/

https://reasonml.github.io/en/try.html?reason=FAGwpgLgBAlgJmAdhGECeBGAXFA5AQygF4A%20PQoqAbQFIAjAZwDoAnfAdygG8AfYKKADMArogDGKAPaIAFADd8IYWACU3fgKgtIwloigKlYDQF9gPEwF0A3MGAB6AFTAAMjERgoAJgA0UDNhQACoAFp7oAA6ekoJQECEwDFBgAB4R2gwMMNJ%20uAD6hAC0ZPn4fmLSEPjuSZGeCiww%20HTgtSH40GL4iIiS0HSeAOZIYGwgMABeYHDAjvZ24NDwSCjoXjgETOTEJRTU9MxsnLwaIuJSsobKalwaAtoQuvpXxgJmFjZ2Tq7ungAcfgCOFCiSgCEE7lQ2X07VqaCi22K23YCTEIVgSVaSWGHjGcXa%20gIAAYtsSoEjibN5kA

最佳答案

bs.raw 是有效的(准确地说是扩展的),因此它受到值的限制: http://caml.inria.fr/pub/docs/manual-ocaml/polymorphism.html#sec51 .

简而言之,函数应用的结果类型不能被泛化,因为它可能捕获了一些隐藏的引用。例如,考虑以下函数:

let fake_id () = let store = ref None in fun y ->
match !store with
| None -> y
| Some x -> store := Some x; y

let not_id = fake_id ()
let x = not_id 3

那么下一次应用not_id将是3。因此not_id的类型不能是∀'a。 'a -> 'a。这就是为什么类型检查器会为您的函数推断类型 '_weak1 -> '_weak1 (使用 4.06 表示法)。此类型 _weak1 不是多态类型,而是未知具体类型的占位符。

在正常设置中,解决方案是将 not_id 设为具有 η-expansion 的值:

 let id x = fake_id () x 
(* or *)
let id: 'a. 'a -> 'a = fun x -> fake_id () x

关于ocaml - 无法输入多态 [%bs.raw 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49351781/

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