作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我在学习 Jason Hickey's Introduction to Objective Caml .
这是一个我没有任何线索的练习
首先,实现一个dictionary
是什么意思作为 function
?我怎么能想象那个?
我们需要吗array
或类似的东西?显然,在这个练习中我们不能有数组,因为 array
尚未在Chapter 3
中引入.但是How do I do it without some storage?
所以我不知道该怎么做,希望得到一些提示和指导。
最佳答案
我认为这个练习的目的是让你使用闭包。例如,考虑文件 fun-dict.ml
中的以下 OCaml 函数对:
let empty (_ : string) : int = 0
let add d k v = fun k' -> if k = k' then v else d k'
# #use "fun-dict.ml";;
val empty : string -> int =
val add : ('a -> 'b) -> 'a -> 'b -> 'a -> 'b =
# let d = add empty "foo" 10;;
val d : string -> int =
# d "bar";; (* Since our dictionary is a function we simply call with a
string to look up a value *)
- : int = 0 (* We never added "bar" so we get 0 *)
# d "foo";;
- : int = 10 (* We added "foo" -> 10 *)
string
上的一个函数
int
的 key 值(value)。
empty
function 是一个字典,将所有键映射到
0
. add 函数创建一个闭包,它接受一个参数,一个键。请记住,我们这里对字典的定义是从键到值的函数,所以这个闭包是一个字典。它检查是否
k'
(闭包参数)是
= k
哪里
k
是刚刚添加的key。如果是,则返回新值,否则调用旧字典。
add
功能。它返回一个函数
fun k' -> if k = k' then v else d k
d
,
k
, 和
v
.要弄清楚它们是什么,我们必须查看封闭范围,即
add
的范围。 .我们在哪里找到
let add d k v = ...
add
之后已返回一个新函数,该函数仍引用要添加的参数。所以闭包是一个必须被某个外部作用域关闭才能有意义的函数。
关于functional-programming - 如何在 OCaml 中将字典实现为函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13708701/
我是一名优秀的程序员,十分优秀!