2011-09-26 32 views
5

Tôi là một noob OCaml. Tôi đang cố gắng tìm ra cách để xử lý một toán tử so sánh được chuyển vào một hàm.OCaml: Sử dụng toán tử so sánh được chuyển vào hàm

Chức năng của tôi chỉ cố gắng chuyển qua toán tử so sánh (=, <,>, v.v.) và int.

let myFunction comparison x = 
if (x (comparison) 10) then 
    10 
else 
    x;; 

Tôi đã hy vọng rằng mã này sẽ đánh giá để (nếu một "=" được thông qua tại):

if (x = 10) then 
    10 
else 
    x;; 

Tuy nhiên, điều này không làm việc. Đặc biệt, nó cho rằng x là một bool, được chứng minh bằng thông báo lỗi này:

This expression has type 'a -> int -> bool 
but an expression was expected of type int 

Làm cách nào để làm những gì tôi đang cố gắng làm?

Về một câu hỏi phụ, làm thế nào tôi có thể tự mình tìm ra điều này vì vậy tôi không phải dựa vào sự giúp đỡ từ một diễn đàn bên ngoài? Tài nguyên nào có sẵn?

+0

Cũng lưu ý rằng một khi bạn có nó trong một biến, bạn không thể sử dụng chúng như các nhà khai thác nội tuyến. –

Trả lời

10

Các toán tử so sánh như <= là các hàm hai tham số (nhị phân) bí mật. Để chuyển chúng thành một tham số, bạn sử dụng ký hiệu (<). Để sử dụng tham số đó bên trong hàm của bạn, bạn chỉ cần đối xử với nó như tên hàm:

let myFunction comp x = 
    if comp x 10 then 
    10 
    else 
    x;; 

printf "%d" (myFunction (<) 5);; (* prints 10 *) 
+0

Để tạo chức năng infix, có một số hạn chế được nêu ở đây, http://stackoverflow.com/questions/6150551/ocaml-why-i-cant-use-this-operator-infix – nlucaroni

+0

Được chấp nhận cho việc đơn giản nhất, chính xác nhất dung dịch. –

4

OCaml cho phép bạn đối xử với các nhà khai thác trung tố như định danh bởi bao quanh chúng trong dấu ngoặc đơn. Điều này làm việc không chỉ cho các toán tử hiện có mà còn cho các toán tử mới mà bạn muốn xác định. Chúng có thể xuất hiện dưới dạng tên hàm hoặc thậm chí là tham số. Chúng phải bao gồm các ký tự biểu tượng và được ưu tiên liên quan đến ký tự đầu tiên của chúng. Vì vậy, nếu bạn thực sự muốn, bạn có thể sử dụng ký hiệu ghi vào cho tham số so sánh của myFunction:

 Objective Caml version 3.12.0 
# let myFunction (@) x = 
     x @ 10;; 
val myFunction : ('a -> int -> 'b) -> 'a -> 'b = <fun> 
# myFunction (<) 5;; 
- : bool = true 
# myFunction (<) 11;; 
- : bool = false 
# myFunction (=) 10;; 
- : bool = true 
# myFunction (+) 14;; 
- : int = 24 
# 

(Nó không rõ ràng điều này làm cho myFunction bất kỳ dễ dàng hơn để đọc tôi nghĩ rằng định nghĩa của các nhà khai thác trung tố mới nên được thực hiện một cách tiết kiệm..)

Để trả lời câu hỏi ở bên em, rất nhiều tài nguyên OCaml được liệt kê trên trang này StackOverflow khác:

https://stackoverflow.com/questions/2073436/ocaml-resources

2

Một số khả năng:

Sử dụng một định nghĩa mới để xác định lại toán tử so sánh của bạn:

let myFunction comparison x = 
    let (@) x y = comparison x y in 
    if (x @ 10) then 
    10 
    else 
    x;; 

Bạn cũng có thể vượt qua @ trực tiếp mà không cần định nghĩa thêm.

Như một giải pháp khác bạn có thể sử dụng một số hàm trợ giúp để xác định những gì bạn cần:

let (/*) x f = f x 
let (*/) f x = f x 

let myFunction comparison x = 
    if x /* comparison */ 10 then 
    10 
    else 
    x 
+0

Lưu ý khác: Hàm trợ giúp tôi đã xác định cho điều này đã có sẵn nếu bạn sử dụng Pin dưới dạng |> và <| trong mô-đun BatStd. Tất cả trong tất cả các Pin thường làm cho cuộc sống của bạn đơn giản hơn rất nhiều cho các nhiệm vụ như vậy. – LiKao

Các vấn đề liên quan