2009-01-30 4 views
4

То, что мне не хватает, это возможность частично применить второй аргумент функции, а не первый. Это особенно полезно, когда я хочу передать функцию на что-то вроде карты, но без необходимости писать лямбда для нее каждый раз.Есть ли встроенный эквивалент Haskell для std :: bind2nd в C++?

Я написал свою собственную функцию для этого (определение ниже, на всякий случай, если для этого не существует какой-либо встроенной функции, и кому-то еще было любопытно), но мне очень хотелось бы знать, есть ли что-то в Прелюдия для этой идиомы, поскольку я предпочитаю повторно использовать, а не изобретать.

Вот мое определение и тривиальный пример:

bind2nd :: (a -> b -> c) -> b -> a -> c 
bind2nd f b = \a -> f a b 

foo :: Int -> Bool -> String 
foo n b | b = show n 
     | otherwise = "blabla" 

alwaysN :: Int -> String 
alwaysN = bind2nd foo True 

ответ

15

Это называется flip.

Пример:

Prelude> flip (-) 2 3 
1 

Для дальнейшего использования, его можно было бы найти, просто поиск Hoogle для типа подписи в вашем вопросе, а именно (a -> b -> c) -> b -> a -> c. :-)