Понимание конструкторов ключ-значение в Haskell - PullRequest
3 голосов
/ 19 июня 2019

Я пытаюсь понять синонимы типов и то, как они могут быть практически использованы.

Это синоним типа:

empty = const Nothing
type KVS a b = a -> Maybe b

И я хочу создать функцию для вставки пары KVS со следующим кодом:

insert k v kvs = \k' -> if k' == k then Just v else kvs k'

MyВопрос об этом коде:

  1. Что такое k' в лямбде?Что он представляет?
  2. Откуда он получает свое значение?
  3. Какое условие if k' == k проверка?

Я понимаю концепции Just и Maybe, но я не могу обернуть голову этим конкретным фрагментом кода.

Было бы неплохо объяснить функциональное программирование.

1 Ответ

8 голосов
/ 19 июня 2019
  1. Что такое k' в лямбде?Что это представляет?

Здесь ваша карта - это просто функция, которая отображает ключ k в Maybe v (значение).Так что k' является параметром в случае, если мы выполняем поиск.

Обратите внимание, что, как @ AJFarmar говорит , одинарная кавычка (') может использоваться как часть идентификаторатакже, в отличие от некоторых (большинства) языков, которые используют это только как часть символьного литерала.Как говорится в отчете Haskell'10 о Лексическая структура :

Идентификатор состоит из буквы, за которой следуют ноль или более букв, цифр, подчеркиваний, и одинарные кавычки .

Он часто используется, поскольку имитирует простой символ [wiki] , который используется в математике для:

В математике простое число обычно используется для генерации большего количества имен переменных для вещей, похожих на , без обращения к индексам - x ′.

Откуда оно получает свое значение?

insert не передаст значение k'.Мы просто создаем новую функцию, которая отображает ключ k' на Just v в случае, если этот ключ совпадает с ключом, который мы добавили k, или в случае, если не удерживается, мы вызываемисходная карта (для поиска на «старой» карте).

Карта empty представляет собой const Nothing, что-то, что отображает все на Nothing, так что это означает, что независимо от того, что мыищите, мы всегда будем извлекать Nothing, что и должно делать пустая карта.

Каково условие, если k' == k проверяет?

В случае поиска он проверяет, совпадает ли ключ, который мы ищем, с ключом пары ключ-значение(k, v) мы только что вставили.Если это так, мы возвращаем Just v, в противном случае мы вызываем старую карту.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...