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转换为返回无。
答案 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的字典不是您可以使用empty3
和put3
构建的字典,所以你不给get3
一本有效的字典
这意味着测试不提供任何信息。
你应该测试的是你的函数实现了一个具有特定属性的字典,而不是字典具有特定的结构
(无论('a,'b) dict3
的表示如何,您的测试都应该有效。)
您需要测试三种情况:
d
是空字典,则get3 k d
为None
。d
不是空字典,但不包含k
的值,则get3 k d
为None
。d
不是空字典,并且包含v
的值k
,则get3 k d
为Some 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);;