web-dev-qa-db-ja.com

`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の違いは何ですか?

38
Nick Heiner

このセマンティクスはF#と同じです(おそらくF#はOCamlに基づいているため):

  • 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
    

2つの形式のいずれかを使用できる場合は、コンパクトであるため、一般的にfunが推奨されます。

関数に関するOCamlドキュメント も参照してください。

40
Russ Cam

私の考え方

function patterns

の省略形です

(fun x -> match x with patterns)

ここで、「パターン」は例です。

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

(そして

fun args -> expr

ラムダを定義する方法です。)

21
Brian

ラスカムは彼の答えで正しいです。

これはそれについて話しているOCamlリストへの投稿です

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

functionは1つの引数のみを許可しますが、パターンマッチングを許可しますが、funは関数を定義するためのより一般的で柔軟な方法です。

関数を使う正当な理由がない限り、私は一般的に楽しみを使います。

これは、投稿したコードで確認できます。ここでは、fun宣言が3つの引数を取り、function宣言が入力に対してパターンマッチングを行います。

8
chollida
fun x1 ... xn -> e

の略語です

function x1 -> ... -> function xn -> e
0