【问题标题】:How do I change type int to 'a type? OCaml (Towers of Hanoi)如何将 type int 更改为 'a type? OCaml(河内塔)
【发布时间】:2016-10-19 22:19:54
【问题描述】:

我是 OCaml 的新手。我写了这段关于河内塔的代码。

let rec hanoi (a,b,c) n =
    if n <> 0 then begin
        hanoi (a,c,b) (pred n);
        Printf.printf "%i %i\n" a b;
       hanoi (c,b,a) (pred n) 
  end;;

我打印:a=起点塔,b=目的地塔。

我想这样做:

hanoi : 'a * 'a * 'a ­> int ­> ('a * 'a) list

如何将 int 类型更改为 'a 类型?有没有办法写一个类型?我应该使用 List.append 添加 ('a list) 吗?

谢谢。

【问题讨论】:

    标签: ocaml towers-of-hanoi


    【解决方案1】:

    您之所以将int 作为n 的类型是因为表达式n &lt;&gt; 0pred n。这两个都要求nint。如果您希望 n 成为任何类型,则需要对这两个表达式进行多态替换。一种可能性是传入一个测试完成的函数和一个以某种方式递减值的函数。

    对于abc 类型,您获得int 的原因是表达式Printf.printf "%i %i\n" a b,它要求它们是整数。同样,您可以传入一个函数来打印您的值。

    然后你就会遇到为各种类型编写这些函数的问题。

    你还说你想返回一个移动列表而不是打印它们。这是一个单独的问题。简短的回答是,您可以将累积的列表作为函数的另一个参数传递并在最后返回。

    【讨论】:

      【解决方案2】:

      这是你真正想要的功能:)

      let rec hanoi_list n (d,a,i) = match n with |0 -> [] |1 -> [ (d, a) ] |_ -> hanoi_list (n-1) (d,i,a) @ hanoi_list 1 (d,a,i) @ hanoi_list (n-1) (i,a,d);;

      希望你能理解:p

      【讨论】:

      • typed : val hanoi_list : int -> 'a * 'a * 'a -> ('a * 'a) list =
      • 我不明白,“d”、“a”和“i”是什么意思。如果你想搬到第三个塔而不是第二个,你应该改变什么?
      • d = 出发,a = 到达,c = 中间。如果您使用 1,2,3 来表示塔,则将所有从第一个塔移动到第三个将得到 hanoi_list 3 (1,3,2)。您只需在调用函数时更改参数即可。
      【解决方案3】:

      如果我理解正确,那么你的问题是你的函数的推断类型是

      (int * int * int) -> int -> unit
      

      你希望它在哪里

      ('a * 'a * 'a) -> int -> ('a * 'a) list
      

      钉的类型被限制为int,因为您正在打印它们,并且仅当a 的类型为int 时才定义printf "%i" a。返回值类型是unit,因为您的函数不会生成塔,而只是打印它。

      【讨论】:

        猜你喜欢
        • 2013-10-12
        • 2012-11-25
        • 2019-07-19
        • 2013-11-03
        • 2013-01-04
        • 2013-06-28
        • 2022-07-31
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多