Dictionary 在SML中创建词典
我是SML语言的新学习者。我已经学习了SML语言的基础知识。但是,我在获取用SML创建词典的代码方面遇到了麻烦。因此,我想知道代码。您可以从为字典定义签名开始:Dictionary 在SML中创建词典,dictionary,sml,smlnj,metalanguage,Dictionary,Sml,Smlnj,Metalanguage,我是SML语言的新学习者。我已经学习了SML语言的基础知识。但是,我在获取用SML创建词典的代码方面遇到了麻烦。因此,我想知道代码。您可以从为字典定义签名开始: signaturedict= 信号 类型(“k,”,v)dict val empty:(“k,”,v)dict val插入:“k->”v->(“k,”,v)dict->(“k,”,v)dict val查找:''k->(''k',v)dict->'v选项 结束 'k(相等类型)假定我需要知道的关于键值存储的键的唯一一件事是,可以比较它是
signaturedict=
信号
类型(“k,”,v)dict
val empty:(“k,”,v)dict
val插入:“k->”v->(“k,”,v)dict->(“k,”,v)dict
val查找:''k->(''k',v)dict->'v选项
结束
'k
(相等类型)假定我需要知道的关于键值存储的键的唯一一件事是,可以比较它是否相等,以便在查找时找到正确的键。这使我能够使用O(n)插入和查找构建一个简单的基于列表的字典:
结构列表DICT:DICT=
结构
类型('k',v)dict=('k*'v)列表
val empty=[]
有趣的插入kv[]=[(k,v)]
|插入k v((k2,v2)::剩余)=
如果k=k2,那么(k,v)::rest-else(k2,v2)::插入k-v-rest
有趣的查找k[]=无
|查找k((k2,v)::剩余)=
如果k=k2,则某个v剩余k
结束
例如,“k
的类型级别限制意味着我不能将我的字典表示为二元搜索树,因为排序(小于、等于、大于)不是相等类型的属性,或者将我的字典表示为哈希表,因为查找值的哈希也不是相等类型的属性
因此,我可能希望密钥可以排序或散列。不幸的是,SML没有一个内置的类,它的类型是可排序的或可散列的,就像它有相等类型一样。克服此限制的一种方法是更改接口,以便将比较或哈希函数传递给模块。下面是如何进行比较的:
ORD签名=
信号
t型
val比较:t->t->order
结束
签名口述=
信号
k型
v型dict
val空:“v dict
val插入:k->'v->'v dict->'v dict
val查找:k->'v dict->'v选项
结束
例如,这允许我编写基于二叉树的字典结构:
函子树指令(Ord:Ord):指令=
结构
k型=Ord.t
数据类型'v dict=k*'v*'v dict*'v dict的叶节点
val empty=Leaf
趣味插入k v叶=节点(k,v,叶,叶)
|插入k v(节点(k2、v2、左、右))=
案例Ord.比较(k,k2)
EQ=>节点(k、v、左、右)
|LT=>节点(k2,v2,插入k v左,右)
|GT=>节点(k2,v2,左,插入k v右)
k叶=无
|查找k(节点(k2、v、左、右))=
案例Ord.比较(k,k2)
EQ=>一些v
|GT=>k右查找
|LT=>k左
结束
缺点是我必须明确我想要什么
例如,键为int
的基于树的词典可以这样制作:
structure IntTreeDict=TreeDict(
结构
类型t=int
val compare=Int.compare
(完)
Yatendra的可能重复:我建议您查看snieguu链接到的问答,因为它或多或少包含您的问题,除非代码反映了您的提问尝试。通常情况下,在提问之前进行尝试是首选的,同时也要寻找以前就同一主题提出的问题。(这通常可以通过谷歌来完成。)你可以用多种方式编写这样的东西——没有“the”代码。做什么在很大程度上取决于你目前所学的东西。