Есть ли встроенный в Haskell эквивалент для std :: bind2nd в C ++? - PullRequest
4 голосов
/ 30 января 2009

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

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

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

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

1 Ответ

15 голосов
/ 30 января 2009

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

Пример:

Prelude> flip (-) 2 3
1

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

...