Какова цель M.empty в функции Daml Map? - PullRequest
0 голосов
/ 09 июля 2020

когда я использую функцию Map, требуется объявить M.empty, если я пропущен из-за ошибки, что является определением вне использования M.empty, как именно функция Map работает в DAML.

Ошибка становится, как показано ниже.

** не удалось сопоставить текст карты исключенного типа ([a]) с фактическим текстом карты типа ([A]) -> текст карты ([A]) **

когда я добавил M.Empty, он не столкнулся с этой ошибкой. Насколько я понимаю, я могу объяснить, как работает карта и в чем причина M.Empty

1 Ответ

3 голосов
/ 09 июля 2020

Было бы легче ответить, если бы вы предоставили ошибочный код, но, судя по тому, что я могу разобрать, похоже, что вы неправильно понимаете, что такое Map.empty. Map.empty - это не функция, это значение; в частности, это карта, у которой нет содержимого.

Карты - это наборы пар ключ / значение. Один из способов создания карты, которую вы хотите, - это начать с пустой карты и затем добавлять каждый из элементов, которые вы хотите, один за другим. Вот пример:

module Main where

import qualified DA.TextMap as Map

testMaps = scenario do
  let m1 = Map.empty
  let m2 = Map.insert "United States" "USD" m1
  let m3 = Map.insert "France" "EUR" m2
  let m4 = Map.insert "United Kingdom" "GBP" m3
  assert (Map.lookup "France" m3 == Some "EUR")

Если в строке

  let m3 = Map.insert "France" "EUR" m2

вы забыли m2, вы получите сообщение об ошибке, которое вы описываете. Это сообщение об ошибке означает: «Я ожидал получить карту (результат вызова функции Map.insert), но вместо этого я получил функцию, которая ожидает карту и возвращает другую карту». Это потому, что DAML имеет функцию, называемую automati c currying ; функция Map.insert определяется как получение ключа, значения и Map и возврат Map. Но вы также можете думать об этом как о получении ключа и возвращении функции, которая принимает значение, которая возвращает функцию, которая принимает Map, которая возвращает Map. Таким образом, если вам не хватает аргумента, указанное выражение c остается действительным, оно просто возвращает функцию, которая по-прежнему ожидает еще один аргумент, а не значение.

...