Разве карта не принимает функцию, а список возвращает список?

map2_List :: (a -> b -> c) -> [a] -> [b] -> [c]
map2_List f [] _ = []
map2_List f (a:as) bs = map (f a) bs ++ map2_List f as bs

Это пример из моей лекции, в котором я пытаюсь применить бинарную функцию ко всем парам элементов двух списков. Часть (f a) меня смущает Предполагается ли это значение, но не функция? Тогда что же map value bs делать?

1 ответ

Решение

"Часть (f a) делает меня смущенным."

То, что здесь происходит, называется каррингом, и если вы приезжаете в Хаскелл с обязательных языков, это может сбить с толку.

В Haskell все функции технически принимают одно значение и возвращают одно значение. Возвращаемое значение может быть другой функцией. Большинство программистов используют умственный способ мышления, думая о функциях, берущих все значения в своем определении (термин "насыщенный" КСТАТИ) и производя окончательное значение, но даже с этим умственным сокращением бывает много раз, когда это происходит, когда это не тот случай.

Функция f является двоичной функцией, и (f a) эта функция частично применяется. Тип (f a) :: b -> c,

"Тогда что же map value bsделать?"

Функция карты(map :: (a->b) -> [a] ->[b]) является частью стандартной прелюдии. Он берет простую функцию и применяет ее к каждому элементу в списке.

Итак, давайтеmap (f a) bsКроме:

  • map :: (b->c) -> [b] ->[c]применяет функцию к каждому элементу списка
  • (f a) :: b -> c используя карри функцию f :: a -> b -> c применяется к a и возвращает функцию b -> c
  • bs это второй список из map2_List
  • Результатом этой функции является [c], функция f применяется к одному элементу первого списка, а затем применяется к каждому элементу второго списка.
Другие вопросы по тегам