Впорядкування параметрів для використання каррі


93

Нещодавно я двічі переробляв код для того, щоб змінити порядок параметрів, тому що там було занадто багато коду, де хакі подобаються flipабо \x -> foo bar x 42відбуваються.

При розробці підпису функції, які принципи допоможуть мені найкраще використовувати каррі?

Відповіді:


111

Щодо мов, які легко підтримують каррінг та часткове застосування, існує одна переконлива серія аргументів, що походить від Кріса Окасакі:

  • Поставте структуру даних як останній аргумент

Чому? Потім ви можете красиво складати операції з даними . Напр insert 1 $ insert 2 $ insert 3 $ s. Це також допомагає для функцій на стан .

Стандартні бібліотеки, такі як "контейнери", дотримуються цієї угоди .

Іноді наводяться альтернативні аргументи, щоб поставити структуру даних на перше місце, тому її можна закрити, отримуючи функції у статичній структурі (наприклад, пошук), які є дещо лаконічнішими. Однак, здається, широкий консенсус полягає в тому, що це менший виграш, тим більше, що він штовхає вас до коду, що входить у дужки.

  • Поставте найрізноманітніший аргумент останнім

Для рекурсивних функцій загальноприйнятим ставити аргумент, який найбільше змінюється (наприклад, акумулятор), як останній аргумент, тоді як аргумент, який змінюється найменше (наприклад, аргумент функції), на початку. Це добре складається з останнім стилем структури даних.


Короткий зміст подання Окасакі наведено в його бібліотеці Едісона (знову ж таки, інша бібліотека структури даних):

  • Часткове застосування : аргументи, які, швидше за все, є статичними, зазвичай з’являються перед іншими аргументами, щоб полегшити часткове застосування.
  • Колекція відображається останньою : у всіх випадках, коли операція запитує одну колекцію або модифікує існуючу колекцію, аргумент колекції відображатиметься останнім. Це щось на зразок фактичного стандарту для бібліотек структури даних Haskell і надає певний рівень узгодженості API.
  • Найбільш звичний порядок : коли операція представляє добре відому математичну функцію в декількох структурах даних, аргументи вибираються таким чином, щоб відповідати найбільш звичному порядку аргументів для функції.

Як наслідок першої точки, також поставте аргумент, який може жити в структурі даних останнім. Це робить карту, фолд та друзів чистішими. tl; dr річ у списку йде останньою.
Джон Ф. Міллер

1
Пошук усе одно не може бути прикутий, тому перший пункт не підтримує цього. haskell.org/haskellwiki/Parameter_order робить умовний аргумент навпаки - "Оскільки об'єкти типу Map представляють відображення, природно мати якусь функцію, яка перетворює об'єкт Map на представлену функцію."
Брендон

11

Розмістіть аргументи, які ви, швидше за все, повторно використаєте, першими. Аргументи функції - чудовий приклад цього. Ви набагато частіше хочете переглядати map fдва різні списки, ніж хочете зіставити багато різних функцій в одному списку.


5
Якщо ви насправді зіставляєте багато функцій за одним списком, можливо, вам слід скласти список функцій і map ($myList)замість цього списку.
Squidly

3

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.