2016-11-02 6 views
5

次の関数:(|)MLプログラミングに意味ですか?例えば

fun fac (0 : int) : int = 1 
    | fac (n : int) : int = n * fac (n - 1) 

または関数で:

fun even 0 = true 
    | even x = odd(x-1) 
and odd 0 = false 
    | odd x = even(x-1); 

私はMLで少し経験を持っていると私はちょうど基本を理解しようとしています。

答えて

6

これはpattern matchingです。リンクから:

機能は、1つ以上のルールで構成されてもよいです。ルールは、その関数名、引数のパターンとその発現から構成されています。関数が呼び出されると、引数の値は、トップダウンの順序でパターンにマッチします。パターンマッチングを用いて機能が表現

このパイプは、パターンマッチングのためのケースを分離する手段をケースに非常に類似しています。パターンマッチングは、特殊なパターンと一致し、そのパターンに基づいて特定の式を実行します。

fun <fun-name> <pattern> 
    | <fun-name> <pattern> 
    | <fun-name> <pattern>; 

<pattern>は次のとおりです:

あなたの最初の例で
<args> = <expressions> 

、それが宣言された関数fac階乗計算のための彼らは、構文に従ってください。 intその場合の発現が実行される、0であり、渡された引数が0である場合(0階乗が1であるので)、この場合には、結果が1になる場合、引数、intが0であるときに第一のパターンです。渡された引数が0でない場合(それが第一のパターンと一致しなかったとして)それは次のパターンに従います。渡された引数がある場合は、2は、それが再帰を実行し、それに応じて階乗を見つけるだろうと言います。


以下のスニペットを考えてみましょう:

fun past "run" = "ran" 
    | past "swim" = "swam" 
    | past x  = x^"ed"; 

私たちは、引数を取り、引数の渡された緊張を見つけpastという名前の関数を定義します。ワード(または渡された引数が)「走る」、渡さ緊張している場合を「走った」され

:平易な英語で - 最初のパターンは同等です。

第二パターンに相当する:ワード(または渡された引数)が、「スイム」、渡された時制が「泳い」である場合

言葉は「水泳」または「実行」(したがって、二つのパターンが一致していない)だけで単語の末尾に「ED」を追加し、最後のパターン、と続けるもない場合。一例では

あなたがその|(パイプ)記号別のパターンを見ることができます。あなたは、この擬似コードのようなパターンを考えることができます。

if argument is "run", then passed tense is "ran" 
else if argument is "swim", then passed tense is "swam" 
else add "ed" to end of word 

パターン・マッチングが不規則な場合をカバーするために使用されます。「走り」と「泳いは」不規則は時制を渡されるので、我々はパターンでこれらのケースをカバーしています。 0 - まったく同じ原理が最初の例に適用されます!特殊なケースであり、それは我々が引数が0である特定の場合に一致し、その特定のケースに応じて実行するようにパターンマッチングを使用することができ、このため1です。あなたが見ている何

+0

は、あなたがこのポストはhttps://meta.stackoverflow.com/questions/351354/に違反しない方法を説明していただけません-iは、あるべき-答えるコード-リクエストを?私は合法的に理解していません。この質問@gregblass – gregblass

+0

が彼らのために書かれたいくつかのコードを持って聞いていない、それは概念の説明を要求します。 – Li357

0

は同時に引数のマッチング機能とパターンを定義するためのショートカット構文です。あなたは、関数定義からパターンマッチングを分割した場合、それは次のようになります。

fun fac (x : int) : int = 
    case x of 
    0 => 1 
    | n => n * fac (n - 1) 
関連する問題