如何从我实现的这本词典中输入和获取值

时间:2015-09-28 23:29:23

标签: 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 -> 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转换为返回无。

2 个答案:

答案 0 :(得分:1)

我希望将其作为评论,但我需要50点声望,所以我尝试多写一点。

put3给出了一个新功能,如果我没记错的话就无法比较。我认为没有什么可以断言的。

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

获取empty3返回None是最简单的。 您断言从None

获得empty3()
assert (get3 "foo" (empty3 ()) = None);;

顺便说一下,如果您想保留类型签名,我认为empty3应该写成fun () -> fun _ -> None

或只是fun _ -> None

答案 1 :(得分:1)

我怀疑empty3应该是一个空字典,而不是一个创建空字典的函数,所以你可能想要

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

get3的测试用例并不是非常有用,因为每个键返回9的字典不是您可以使用empty3put3构建的字典,所以你不给get3一本有效的字典 这意味着测试不提供任何信息。

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

您需要测试三种情况:

  • 如果d是空字典,则get3 k dNone
  • 如果d不是空字典,但不包含k的值,则get3 k dNone
  • 如果d不是空字典,并且包含v的值k,则get3 k dSome 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);;