【问题标题】:Array of a type with a parameter in OcamlOcaml中带参数的类型数组
【发布时间】:2011-09-06 02:29:01
【问题描述】:

我在 Ocaml 有一个家庭作业要做...

我的老师说我们必须使用这两种类型:

type 'a zapis = Prazen | Zapis of string * 'a;;
type 'a asocpolje = 'a zapis array;;

我的问题是当我创建一个数组时:

# let a = Array.make 5 Prazen;;
val a : '_a zapis array = [|Prazen; Prazen; Prazen; Prazen; Prazen|]

我不知道这个数组可以插入什么值...

a.(0)<-???

谁能告诉我可以在这个数组中插入哪个值?

【问题讨论】:

    标签: arrays types ocaml


    【解决方案1】:

    在您向数组添加任何内容之前,该类型并未完全定义。这反映在为数组指示的类型中:

    val a : '_a zapis array = [|Prazen; Prazen; Prazen; Prazen; Prazen|]

    如果您仔细观察,您会发现您作为类型参数提供的'a 已变为'_a(注意_)。这种类型的意思是“某种类型,但我还不知道是哪一种”。与 'a 不同,'a 表示任何类型。

    这意味着此时您可以插入任何类型的 Zapis。完成此操作后,您只能插入该特殊类型的 Zapi(在其​​他类型中,'_a 消失并替换为正确的类型)。

    如果你这样做了

    a.(0) <- Zapis ("z", 10)
    

    a 将变为 int zapis array 并且从那一刻起只接受整数。

    如果你这样做了

    a.(0) <- Zapis ("z","z") 
    

    它会变成string zapis array,之后只接受字符串。

    【讨论】:

    • 你能告诉我如何创建一个数组类型asocpolje吗?
    【解决方案2】:

    你能告诉我如何创建一个数组类型asocpolje吗?

    'a asocpolje'a zapis array同一类型。根据打字机如何准确地推断您的定义,您会得到其中一个,但它们是完全等价的。 'a asocpolje 只是'a zapis array别名,而不是新类型。

    您可以通过使用显式类型注释来帮助 OCaml 打印正确的类型信息:

    let t : 'a asocpolje = Array.make ...
    

    然而,我会不鼓励这种做法。它以不明显的方式表现(例如,'a 的含义可能令人惊讶,它不强制执行多态性),并且您确实试图在没有的地方有所作为(类型相同)。如果您真的想要区分这两种类型,您应该将'a asocpolje 定义为一种新的代数类型(只有一种情况):

    type 'a zapis = Prazen | Zapis of string * 'a;;
    type 'a asocpolje = Asocpolje of 'a zapis array;;
    
    let t = Asocpolje (Array.make ...)
    let get (Asocpolje t) n = t.(n)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-09-22
      • 1970-01-01
      • 2022-01-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多