F # рассматривает операторы как функции - PullRequest
3 голосов
/ 27 июля 2011

В F # есть ли способ рассматривать оператор как функцию?В контексте я хотел бы частично применить операторы (как инфиксные, так и префиксные), но компилятор, кажется, рад лишь частично применить функции.

Пример: вместо возможности писать List.map (2 **) [0..7];; я должен определитьмоя собственная функция pow x y (а затем еще одна функция let swap f x y = f y x;;, потому что компилятор не позволит мне также частично применить |>, как в List.map (|> pow 2) [0..7];;.) В конце мой код должен работать List.map (swap pow 2) [0..7];;.

Ответы [ 2 ]

5 голосов
/ 27 июля 2011

Я бы просто сделал:

[0..7] |> List.map (fun n -> pown n 2)

Или, если 2 является основанием:

[0..7] |> List.map (pown 2)

Это тоже работает:

[0.0..7.0] |> List.map (( ** ) 2.0)
3 голосов
/ 27 июля 2011

Нет никаких «операторских секций» а-ля Хаскелл;используйте лямбду, чтобы частично применить операторы, например,

(fun x -> x - 10)

. Первый аргумент можно частично применить, если вы зададите префиксным оператором инфикса, заключив его в скобки, например,

(fun x -> 10.0 / x)

и

((/) 10.0)

означают одно и то же.

...