Уловка для «повторного использования» аргументов в Haskell?

Время от времени я натыкаюсь на проблему, которую хочу выразить «пожалуйста, используйте последний аргумент дважды», например, чтобы написать безточечный стиль или избежать лямбды. Например,

sqr x = x * x

можно было бы записать как

sqr = doubleArgs (*) where
   doubleArgs f x = f x x

Или рассмотрим эту немного более сложную функцию (взято из этого вопроса ):

ins x xs = zipWith (\ a b -> a ++ (x:b)) (inits xs) (tails xs)

Я мог бы написать этот код без точек, если бы существовала такая функция:

ins x = dup (zipWith (\ a b -> a ++ (x:b))) inits tails where
     dup f f1 f2 x = f (f1 x) (f2 x)

Но поскольку я не могу найти что-то вроде doubleArgs или dup в Hoogle, я полагаю, что могу пропустить здесь какой-то трюк или идиому.

21
задан Community 23 May 2017 в 12:08
поделиться