2010-11-22 1 views
7

Есть ли способ изменить порядок от лево-ассоциативного к право-ассоциативному, кроме круглых скобок? Например, в Haskell вы можете написать foo $ bar b, а foo будет применен к результату от bar b.Изменить заказ приложения в OCaml

let a x = x * 4;; 
let b y = y + 2;; 

let c = a ??? b 3;; 

print_int c;; 

Если печать 20

ответ

6

Конечно, вы можете определить сам:

let (@@@) f x = f x 

Затем a @@@ b 3 оценивает 20. Убедитесь в том, чтобы выбрать отправной символ так, чтобы она правоассоциативная (see here) ($... - левый ассоциативный)

+1

Вы можете просто определить оператор «$», как в Haskell: пусть ($) fx = fx ;; – aneccodeal

+1

Нет, на самом деле, вы не можете использовать '$'. Он работает для этого базового примера, но не если вы попробуете 'f $ g $ h x' –

4

Вам просто нужно определить символ для таких приложений:

let (@@@) f x = f x ;; 

И тогда

let f x = x * 4;; 
let g y = y + 2;; 
let a = f @@@ g 3;; 
print_int a;; 

делает Распечатайте 20.

Обратите внимание, что в следующей версии OCaml (3.13 или 4.00) обеспечит встроенные примитивы для приложений, которые не создавать промежуточные частично применяемые функции:

external (@@@) : ('a -> 'b) -> 'a -> 'b = "%apply" 
external (|>) : 'a -> ('a -> 'b) -> 'b = "%revapply" 

Последнее, что противоположно %apply :

print_int (3 |> g |> f);; 

Обратите внимание, что вы не можете использовать ($), как это левоассоциативные в определении OCaml парсер:

let ($) f x = f x ;; 
let a = f $ g 3;;  (* ok ! ??? *) 
let a = f $ g $ g 3;; (* ERROR -> g is not an integer, 
         because OCaml computes (f $ g) first *) 
+0

Почему бы не сократить @@ вместо @@@? Он уже используется в стандартной библиотеке? – Ricardo

 Смежные вопросы

  • Нет связанных вопросов^_^