gpt4 book ai didi

ocaml - 具有自定义数据类型的 Stream.of_list

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

我正在尝试定义一种新的数据类型,创建一个列表,然后从列表中创建一个流:

type 'a myType =  Name of char ;;
let myList = [Name('a')];;
let myStream = Stream.of_list myList;;

错误:这个表达式的类型,'_a myType Stream.t, 包含不能泛化的类型变量

有什么想法吗?

最佳答案

在您的代码中,myStream 是类型为 myType 的流,由未知类型(在上述错误中称为 '_a ).编译器在您的代码中找不到足够的信息来说明 '_a 应该是什么。

在某些情况下,编译器会通过声明 '_a 可以是任何东西来概括类型。例如,myList 被正确标识为 'a myType list。但是,由于Stream.t是抽象类型,泛化可能会出错,所以没有进行。

解决此问题的一种方法是指定 '_a 的类型,如果您只打算将它与单一类型一起使用,例如使用类型约束:

let myStream : int myType Stream.t = ...

另一种方法,如果你想保持它的通用性,就是把它变成一个函数(然后自动泛化):

let myStream () = Stream.of_list myList

如预期的那样,类型将是 unit -> 'a myType Stream.t

这种泛化可能导致错误的根本原因是存在可变状态。假设我这样定义了四个文件:

(* ref.ml *)
let x = ref None

(* ref.mli *)
val x : 'a option ref

(* a.ml : 'a = string *)
Ref.x := Some "Hello"

(* b.ml : 'a = int *)
match !ref x with None -> () | Some i -> print_int i

这会导致运行时错误。因此,无论何时涉及可变状态,都无法泛化类型。

关于ocaml - 具有自定义数据类型的 Stream.of_list,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5471545/

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