了解Haskell中的键值构造函数

3 haskell functional-programming key-value

我试图了解类型同义词以及如何实际使用它们。

这是类型的同义词:

empty = const Nothing
type KVS a b = a -> Maybe b
Run Code Online (Sandbox Code Playgroud)

我想制作一个函数,KVS以使用以下代码插入一对:

insert k v kvs = \k' -> if k' == k then Just v else kvs k'
Run Code Online (Sandbox Code Playgroud)

我对这段代码的疑问是:

  1. 什么是k'在lambda?它代表什么?
  2. 它从哪里获得价值?
  3. 什么是状态if k' == k检查?

我不明白的概念JustMaybe,但代码这个特殊的一块是我无法绕到我的头。

关于函数式编程的解释会很好。

Wil*_*sem 7

  1. 什么是k'在lambda?它代表什么?

在这里,您的映射只是一个将键映射kMaybe v(值)的函数。因此,k'在情况下,我们执行查找参数。

请注意,正如@AJFarmar所说,单引号(')也可以用作标识符的一部分,这与某些(大多数)语言仅将其用作字符文字的一部分不同。正如Haskell'10报告对词法结构所说的那样

标识符包含一个字母,后跟零个或多个字母,数字,下划线和单引号

由于它模仿素数[wiki],因此经常使用,它在数学中用于以下用途:

在数学中,素数通常用于为相似的事物生成更多的变量名,而无需使用下标– x?。

 

  1. 它从哪里获得价值?

insert不会传值k'。我们简单地构造一个新函数,将键映射k'到一个Just v与键相同的情况(如果键与我们添加的键相同)k,或者如果键保留,则调用原始映射(以在“旧”映射中进行查找) 。

empty地图是一个const Nothing,东西映射的一切Nothing,这样就意味着,无论是我们的查找,我们将始终检索Nothing,这的确是一个空的地图是应该做的。

  1. k' == k检查的条件是什么?

如果进行查找,它将检查我们查找的键是否与(k, v)我们刚刚插入的键值对的键相同。如果成立,我们将返回a Just v,否则,我们将调用旧地图。

  • 值得一提的是,Haskell允许在变量名的末尾添加`',因为它模仿了['prime'符号](https://en.wikipedia.org/wiki/Prime_(symbol))常用于数学。这可能会引起混淆,因为在大多数语言中,引号仅保留给字符串和字符。 (3认同)