Разве карта не принимает функцию, а список возвращает список?
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
применяется к одному элементу первого списка, а затем применяется к каждому элементу второго списка.