2009-10-21 38 views
31

Đôi khi tôi nhìn thấy mã nhưSự khác biệt giữa từ khóa `fun` và` function` là gì?

let (alt : recognizer -> recognizer -> recognizer) = 
    fun a b p -> union (a p) (b p) 

Hoặc như:

let hd = function 
    Cons(x,xf) -> x 
    | Nil -> raise Empty 

sự khác biệt giữa funfunction là gì?

+2

Đã xóa thẻ 'vui' vì nó có ý nghĩa được thiết lập khác với ý định của bạn ở đây. Tôi nghĩ rằng câu hỏi sẽ tốt hơn nếu không có nó, vì một số người lọc nó ra bằng cách sử dụng danh sách bỏ qua. –

Trả lời

36

Ngữ nghĩa của việc này là giống như trong F # (có lẽ vì F # được dựa trên OCaml):

  • function cho phép việc sử dụng các mô hình phù hợp (ví dụ: |), nhưng kết quả là nó có thể chỉ được thông qua một đối số.

    function p_1 -> exp_1 | … | p_n -> exp_n 
    

    tương đương với

    fun exp -> match exp with p_1 -> exp_1 | … | p_n -> exp_n 
    
  • fun không cho phép kết hợp mô hình, nhưng có thể được thông qua nhiều đối số, ví dụ

    fun x y -> x + y 
    

Khi một trong hai hình thức có thể được sử dụng, fun thường được ưa thích do chặt của nó.

Xem thêm OCaml documentation on Functions.

+5

Tôi đã không downvote, nhưng, mô tả 'vui' ưa thích bởi vì nó nhỏ gọn hơn không phải là toàn bộ câu chuyện, nó thậm chí không phải là một mô tả về cách sử dụng nó, và không có cách nào là bạn so sánh hai từ khóa! chức năng là giống như nói, (vui vẻ x -> phù hợp với x với ...), làm thế nào là nhỏ gọn hơn nếu bạn có kế hoạch để phù hợp với mô hình? – nlucaroni

+0

Sẽ cập nhật với nhiều chi tiết hơn ngay bây giờ. –

+0

Câu trả lời của tôi đã tham chiếu của bạn cũng đã được bình chọn. – chollida

8

Russ Cam đúng trong câu trả lời của anh ấy.

Đây là một bài viết trên danh sách OCaml nói về nó

http://caml.inria.fr/pub/ml-archives/ocaml-beginners/2003/11/b8036b7a0c1d082111d7a83c8f6dbfbb.en.html

function chỉ cho phép một đối số nhưng cho phép cho phù hợp với mô hình, trong khi fun là cách tổng quát hơn và linh hoạt để xác định một hàm.

Tôi thường sử dụng niềm vui trừ khi có lý do chính đáng để sử dụng chức năng.

Bạn có thể thấy điều này trong đoạn code bạn được đăng nơi khai fun mất 3 lập luận và tuyên bố function làm mô hình kết hợp trên đó của đầu vào

+0

, bạn không thể làm 'cho x y z = y + z', không có' fun' hay 'function'? –

+0

@Rosarch, vâng, tất nhiên. Tôi nghĩ câu hỏi là ngầm định về các định nghĩa hàm ẩn danh. –

+0

@Rosarch, chắc chắn :) – chollida

19

Con đường tôi nghĩ về nó

function patterns 

là viết tắt cho

(fun x -> match x with patterns) 

nơi 'mẫu' là ví dụ

| Some(x) -> yadda | None -> blah 

(Và

fun args -> expr 

là cách bạn định nghĩa một lambda.)

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