我有一个堆栈,我需要将一个项目从堆栈中弹出一个数组。堆栈中的东西是整数,但是ocaml并没有这样看:
let test = Array.make 10 0
Array.set test 0 pop
错误:
Error: This expression has type 'a Stack.t -> 'a but an expression was
expected of type int
我也试过用符号表做这个:
let symbol_table = amake 256 (false, 0.0)
但是出现了这个错误
This expression has type int -> 'a -> 'a array
but an expression was expected of type 'b array
任何提示?
答案 0 :(得分:1)
Array.set test 0 pop
...要求将test
数组的第0个元素设置为值pop
,这是类型'a Stack.t -> 'a
的函数,即使该数组仅包含{{ 1}}值。
您需要将int
应用于pop
类型的值才能获得int Stack.t
。
int
我没有足够的上下文来使用Array.set test 0 (pop some_stack)
复制错误,这在我这边工作正常并且在应用于256和amake
时按预期返回(bool * float) array
。
答案 1 :(得分:1)
这是执行你要宣传的工作代码:
(* I have a stack. *)
let myStack = Stack.create () ;;
(* The things in the stack are ints. *)
Stack.push 42 myStack ;;
Stack.push 23 myStack ;;
Stack.push 12 myStack ;;
(* I have an array of ints. *)
let myArray = Array.make 10 0 ;;
(* I pop an element of the stack and put it into
the 0-th place of the array. *)
Array.set myArray 0 (Stack.pop myStack) ;;
(* And I do it again with a different syntax, except
now I place the popped element into the 1st place. *)
myArray.(1) <- Stack.pop myStack ;;
与您的代码相比:
test
的数组。也许您认为Stack
是一个堆栈,但事实并非如此。它是一个定义使用堆栈的函数的模块。要实际制作堆栈,您应该使用Stack.create ()
。Stack.pop
,你会得到弹出功能。要真正弹出一些东西,你需要写Stack.pop myStack
。让我们练习更多:如果你写Stack.create
你得到堆栈创建函数,如果你写Stack.create ()
函数实际上被调用并返回一个新创建的空叠加。
这是否澄清了什么?
答案 2 :(得分:1)
您没有指定您希望阵列保持哪种非标准类型。但是你用标准类型初始化它,即int
。行let test = Array.make 10 0
(或等效let test = [|0;0;0;0;0;0;0;0;0;0|]
)用整数零填充数组。隐含地,test
的类型固定为int array
,因此无法将任何条目设置为除整数之外的任何内容。
答案 3 :(得分:0)
我想这与您声明和使用堆栈的方式有关。以下代码只是一个例子。
let st = Stack.create();;
Stack.push 5 st;;
let pop = Stack.pop st;;
在您的情况下,我认为您打算将模块堆栈用作堆栈。
答案 4 :(得分:0)
您应该使用Array.init
函数从某个堆栈创建一个数组。
假设您有任何类型some_stack
的堆栈,其中包含任何类型x
的元素,并且具有类型为pop
的函数some_stack -> x
,代码将为看起来像这样:
let pop_from_stack number_of_elements stack =
Array.init number_of_elements (fun _ -> pop stack)