Dictionary 如何从我实现的字典中输入和获取值

Dictionary 如何从我实现的字典中输入和获取值,dictionary,recursion,functional-programming,ocaml,Dictionary,Recursion,Functional Programming,Ocaml,所以经过一系列的尝试和错误,我很确定这就是它应该是什么 type ('a,'b) dict3 = ('a -> 'b option) let empty3 : unit -> ('a,'b) dict3 = fun x -> (fun y -> None);; let put3 : 'a -> 'b -> ('a,'b) dict3 -> ('a,'b) dict3 = fun key value dict -> fun x -> i

所以经过一系列的尝试和错误,我很确定这就是它应该是什么

type ('a,'b) dict3 = ('a -> 'b option)

let empty3 : unit -> ('a,'b) dict3 =  fun x -> (fun y ->  None);;

let put3 : 'a -> 'b -> ('a,'b) dict3 -> ('a,'b) dict3 = fun key value dict -> fun x -> if x = key then Some value else dict x;;

let get3 : 'a -> ('a,'b) dict3 -> 'b option = fun key dict -> dict key;;
但现在我有了这个,我很困惑他们是如何相互沟通的。我试着为get3做一个测试,结果是:

let _ = assert (get3 42 (fun lst -> Some (String.length "charizard")) = Some 9);;

我认为这是正确的。但是我不知道如何为put3编写断言案例,因为我不知道如何显示('a,'b)dict3,也不知道如何获取empty3以返回None。

我想把它作为一个注释,但我需要50个声誉,所以我试着写多一点

put3
提供了一个新函数,如果我没记错的话,这个函数是无法比较的。我认为没有什么可以断言的

也许可以尝试放置一些东西,然后使用
get3
检索它,并断言值是相同的

让empty3返回None是最容易的。 您断言您从
empty3()

顺便说一句,如果你想保留类型签名,我认为
empty3
应该写为
fun()->fun\u->None


或者干脆
fun->None
我怀疑
empty3
应该是一个空字典,而不是一个创建空字典的函数,所以您可能想要

let empty3 : ('a,'b) dict3 =  fun _ ->  None;;
您的
get3
测试用例不是很有用,因为为每个键返回9的字典不是您可以使用
empty3
put3
构建的字典,因此您没有给
get3
一个有效的字典。
这意味着测试不提供任何信息

您应该测试的是,您的函数实现了具有特定属性的字典,而不是字典具有特定的结构。
(无论
('a,'b)dict3的表示形式如何,您的测试都应该有效)

您需要测试三个案例:

  • 如果
    d
    是空字典,
    get3kd
    None
  • 如果
    d
    不是空字典,但不包含
    k
    的值,
    get3kd
    None
  • 如果
    d
    不是空字典,并且包含
    k
    的值
    v
    get3 k d
    一些v
这些将提供有用的信息:

let _ = assert (get3 43 empty3 = None);;
let _ = assert (get3 43 (put3 44 9 empty3) = None);;
let _ = assert (get3 43 (put3 43 9 empty3) = Some 9);;
你说的“秀”是什么意思?印刷?函数不可打印,因此无法打印词典。
let _ = assert (get3 43 empty3 = None);;
let _ = assert (get3 43 (put3 44 9 empty3) = None);;
let _ = assert (get3 43 (put3 43 9 empty3) = Some 9);;