创建一个可以容纳非标准类型的数组

时间:2016-10-28 10:07:46

标签: functional-programming ocaml

我有一个堆栈,我需要将一个项目从堆栈中弹出一个数组。堆栈中的东西是整数,但是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

任何提示?

5 个答案:

答案 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 ;;

与您的代码相比:

  1. 您从未制作过堆叠,只创建了一个名为test的数组。也许您认为Stack是一个堆栈,但事实并非如此。它是一个定义使用堆栈的函数的模块。要实际制作堆栈,您应该使用Stack.create ()
  2. 如果你写Stack.pop,你会得到弹出功能。要真正弹出一些东西,你需要写Stack.pop myStack
  3. 让我们练习更多:如果你写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)