Haskell中String到Maybe a映射实现:insert函数疑问解答
Haskell函数式Map实现的insert函数解析
先明确核心前提:这里定义的Map a本质是一个函数,类型为String -> Maybe a——它接收一个字符串键,返回对应的值(包装在Maybe里),而非传统的哈希表/树这类数据结构。下面逐个解答你的疑问:
1. insert中的lambda逻辑是什么?
insert的作用是生成一个新的映射函数:
- 它接收两个参数:要插入的键值对
(s, a),以及旧的映射m; - 返回的lambda是一个新的
Map函数,逻辑是:当这个新函数被传入一个查询键x时,先判断x是否等于插入的键s:- 如果相等,直接返回
Just a(返回插入的新值); - 如果不相等,就把查询委托给旧映射
m,也就是调用m x去旧映射里查找。
- 如果相等,直接返回
2. x的含义是什么?
你觉得“x未被传入参数”是混淆了函数层级:x不是insert函数的参数,而是insert返回的那个lambda函数的参数。这个lambda是一个等待接收查询键的函数,后续当你用lookup或者直接调用这个映射时,传入的查询键就是这里的x。
3. insert ("foo", 61) empty的求值结果是什么?
把empty代入insert的m参数后,得到的是一个新的函数:
\x -> if x == "foo" then Just 61 else empty x
而empty x的结果是Nothing,所以可以简化为:
\x -> if x == "foo" then Just 61 else Nothing
本质上这是一个专门处理"foo"键的映射函数:查"foo"返回Just 61,查其他任何键都返回Nothing。
4. 为何lookup "foo" (insert ("foo", 61) empty)会返回Just 61?
看lookup的定义:lookup x m = m x——它的逻辑就是把查询键x传给映射函数m,让m自己处理查询。
这里的m是insert返回的新函数,当把x="foo"传给它时,触发条件x == "foo"成立,所以直接返回Just 61。
内容的提问来源于stack exchange,提问作者Omega4
相关产品推荐
相关产品推荐

