Как вы определяете 2-й (или 3-й, 4-й,…) параметр в F # или любом другом функциональном языке?

Если вы запускаете оболочку в интерактивном режиме, а целевой каталог статичен, вы можете просто поместить псевдоним в ваш файл ~/.bashrc:

alias cdfoo='cd theFooDir'

При работе с неинтерактивными сценариями оболочки, вы можете создать протокол между родительским скриптом Bash и скриптом child Bash. Один из способов реализации этого заключается в том, чтобы позволить дочернему скрипту сохранять путь в файл (например, ~/.new-work-dir). После завершения дочернего процесса родительский процесс должен будет прочитать этот файл (например, cd `cat ~/.new-work-dir`).

Если вы планируете часто использовать правило, упомянутое в предыдущем абзаце, я бы предложил вам скачать Bash и исправить его так, чтобы он автоматически менял рабочий каталог на содержимое ~/.new-work-dir после каждого запуска команды. В патче вы можете даже реализовать полностью новую встроенную команду Bash, которая соответствует вашим потребностям и реализует протокол, который вы хотите реализовать (эта новая команда, вероятно, не будет принята разработчиками Bash). Но исправление работает для личного использования и для использования в меньшем сообществе.

13
задан Dax Fohl 15 December 2009 в 23:04
поделиться

3 ответа

Обычно вы просто используете лямбда:

fun x y z -> f x y 42

- это функция, подобная 'f', но с третьим параметром, привязанным к 42.

Вы также можете использовать комбинаторы (например, кто-то упомянул Haskell's " flip "в комментарии), которые меняют порядок аргументов, но я иногда нахожу это запутанным.

Обратите внимание, что большинство каррированных функций написаны так, что сначала идет аргумент, который, скорее всего, будет частично применен.

В F # есть именованные параметры для методов (а не значения функции, привязанные к let), но имена применяются к «кортежным» параметрам. Именованные параметры каррирования не имеют особого смысла; если у меня есть каррированная функция с двумя аргументами 'f', я бы ожидал, что с учетом

let g = f
let h x y = f x y

, тогда 'g' или 'h' будут заменены на 'f', но 'именованные' параметры делают это не обязательно истинным. То есть '

19
ответ дан 1 December 2019 в 19:14
поделиться

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

Вы можете попробовать создать что-то вроде функции Haskell flip . Создание вариантов, которые перемещают аргумент дальше в списке аргументов, не должно быть слишком сложным.

let flip f a b = f b a
let flip2 f a b c = f b c a
let flip3 f a b c d = f b c d a
5
ответ дан 1 December 2019 в 19:14
поделиться

В Python вы можете использовать functools.partial или лямбду. Python имеет именованные аргументы. functools.partial может использоваться для указания первых позиционных аргументов, а также любого именованного аргумента.

from functools import partial

def foo(a, b, bar=None):
    ...

f = partial(foo, bar='wzzz') # f(1, 2) ~ foo(1, 2, bar='wzzz')
f2 = partial(foo, 3)         # f2(5) ~ foo(3, 5)

f3 = lambda a: foo(a, 7)     # f3(9) ~ foo(9, 7)
4
ответ дан 1 December 2019 в 19:14
поделиться
Другие вопросы по тегам:

Похожие вопросы: