2009-10-21 7 views
31

時々私は`fun`と` function`キーワードの違いは何ですか?

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

などのようなコードを参照してください。

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

funfunctionの違いは何ですか?

+2

ここにあなたの意図以外の意味があるので、 'fun'タグを削除しました。私は、無視リストを使用してフィルタリングする人がいるので、それがなくても問題は改善されると思う。 –

答えて

36

(F#はOCamlで基づいているためか)、このためのセマンティクスはF#の場合と同じである:

  • function(すなわち|)パターンの使用が一致することができますが、結果的にそれだけで渡すことができます1つの議論。

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

    例えば、パターンマッチングを許可していないが、複数の引数を渡すことができ

    fun exp -> match exp with p_1 -> exp_1 | … | p_n -> exp_n 
    
  • funと等価です二つの形式のいずれかを使用することができる

    fun x y -> x + y 
    

fun一般に、そのコンパクトさに好ましいです。

OCaml documentation on Functionsも参照してください。

+5

私はdownvoteをしませんでしたが、「fun」をよりコンパクトであると記述することは全体の話ではなく、使い方の説明でもなく、決して2つのキーワードを比較していません!関数は、(fun x - > xと...をマッチさせる)と同じですが、パターンマッチングを計画しているなら、それはどのようにコンパクトになっていますか? – nlucaroni

+0

詳細が更新されます。 –

+0

私の答えはあなたのものを引用したものです。 – chollida

8

Russ Camは彼の答えで正しいです。ここで

それについて

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

functionを話してOCamlのリスト上の投稿には、一つだけの引数が可能になりますが、funは、関数を定義するために、より一般的で柔軟な方法である一方で、パターンマッチングを可能にしています。

機能を使用する正当な理由がない限り、私は一般的に楽しく使っています。

あなたはfun宣言は3つの引数を取り、あなたが投稿のコードでこれを見ることができるとfunction宣言は、それの入力

+0

'fun x'や' function'を使わずに 'let x y z = y + –

+0

@Rosarch、はい、もちろんです。私はその質問が無名関数定義について暗黙のうちにあると思う。 –

+0

@Rosarch、確かに:) – chollida

19

function patterns 

がの省略形です、私はそれについて考える方法をパターンマッチングを行います

(fun x -> match x with patterns) 

ここで、「パターン」は、

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

(そして

fun args -> expr 

あなたがラムダを定義する方法です。)

関連する問題