Нет жесткого и быстрого «правила», определяющего, когда следует использовать один стиль над другим.
Функция, определенная как
f x = \y => ...
, точно равна функции, определенной как
f x y = ...
Мы могли бы предпочесть первые обозначения, когда хотим подчеркнуть, что нам нравится видеть f
как 1-арную функцию, чей кодомен состоит из функций. Вместо этого мы использовали бы второе обозначение, когда нам хотелось бы видеть f
в качестве 2-арной функции.
Для композиции функций вы написали
composite g f = \x => g (f x)
, поскольку композиция обычно рассматривается как 2 -функция Мы могли бы также написать
composite g f x = g (f x)
, но это, хотя и короче, не так ясно, так как это предлагает читателю-человеку рассмотреть composite
как 3-арную функцию. Будучи человеком, я также предпочитаю первую форму, но для компьютера не было бы никаких предпочтений.
Если бы я не мог использовать композицию, как вы, я написал бы код Брэди как
twice f = \x => f (f x)
чтобы подчеркнуть, что мы действительно хотим видеть twice
как отображение функции на функцию (endo-to-endo, чтобы быть разборчивым). Две формы полностью эквивалентны.
Наконец, более математическое примечание: с фундаментальной точки зрения нет необходимости в обозначении
f x1 ... xn = stuff
, которое мы обычно используем для определения функции. Чтобы быть чрезвычайно педантичным c, вышеприведенное фактически не определяет f
, а только определяет, как f
ведет себя применительно к n
аргументам. Поскольку мы знаем, что это однозначно идентифицирует f
, нас это не волнует. Но если бы мы это сделали, мы бы определили f
, как мы определяем что-либо еще, то есть с помощью определяющего уравнения вида
f = something
и, в частности,
f = \x1 .. x2 => stuff
Итак, каждый определение формы f x1 .. xn = ...
с n>0
можно рассматривать как syntacti c sugar : обозначение, которое мы можем использовать для программирования, но которое мы можем игнорировать при изучении теории, связанной с языком программирования , Конкретно, если мне нужно математически доказать свойство во всех программах P
, мне не нужно рассматривать случаи, когда P
использует сахар syntacti c, а только случаи, когда каждое уравнение имеет вид f = ...
, возможно, с лямбдами. Это упрощает доказательство, поскольку нам нужно иметь дело с меньшим количеством случаев.
Теперь я не знаю слишком много Идриса, поэтому я не знаю, возможно ли это преобразование в лямбды во всех случаях, в Идрисе , В Агде это было бы невозможно, например, из-за того, как выполняется зависимое исключение. В Coq это было бы возможно. Пока вам не нужны зависимые типы, у вас все будет хорошо.