2017-12-24 17 views
2

Ocamlや関数型言語の一般的な学習を試みる中で、私はパターンマッチングについて検討してきました。"正方形"タプルのOcamlパターンマッチング?

4タプルの各要素が等しいように整数4タプルが入力されたときには、trueと評価される式を作成します。これは、this documentationです。

(4、4、4、4) - >true

(4、2、4、4) - > Iは見つけるfalse

その値の特異性についてパターンマッチングを行います要素は明白ではない。これは私が書いたコードです。もちろん

let sqr x = match x with 
    (a, a, a, a) -> true 
| (_, _, _, _) -> false ;; 

、このコードは、次のエラースロー:

Error: Variable a is bound several times in this matching

の他にどのように私は、xが4組であることを強制することができないだけでなく、等しい厳密整数の?

(もちろん、正方形のタプルは正の整数ではないはずですが、今のところ私は上記の問題にもっと関心があります)。 `

+2

OCamlには、それぞれの変数が一度に現れる、いわゆる「線形」パターンしかありません。パターンは、マッチングされた値の異なる部分の間で同等性を強制することはできません。 –

+1

次のように関数の引数にパターンマッチさせることもできます: '' 'let sqr(a、b、c、d)= a = b && b = c && c == d''''より自然に見えるかもしれない – ghilesZ

答えて

6

他の言語のパターンマッチングシステムとは異なり、OCamlではこれを行うことはできません。

let sqr x = 
    match x with 
    | (a, b, c, d) when a = b && b = c && c = d -> `Equal 
    | (a, b, c, d) when (a < b && b < c && c < d) 
        || (a > b && b > c && c > d) -> `Ordered 
    | _ -> `Boring 
+0

興味深い。私は全体として関数型プログラミングには新しいです。私はOcamlが型推論をしているのを知っていますが、あなたのプログラムは '' a''または '' int''のタプルを許していますか?また、「Equal」と「Ordered」は...何ですか?ありがとう! – TrueAzure

+2

@TrueAzure OCamlではポリモーフィックな比較演算子しか使われないので、 'sqr'は任意の(単一の)型のタプルを受け入れます。 '\' Equal'とFriendsは[多型](https://caml.inria.fr/pub/docs/manual-ocaml-4.06/lablexamples.html#sec46)です。 –

0

あなたはパターンマッチングを行うための多くの方法を持っている、パターンマッチングではありません。何ができること(同等のような)いくつかのプロパティは、それら全体で保持している場合にのみ成功するために警備員を使用しながら、個別のタプルの各要素を一致さですここで試合キーワード

let fourtuple_equals (a,b,c,d) = List.for_all ((=) a) [b;c;d] 
val fourtuple_equals : 'a * 'a * 'a * 'a -> bool = <fun> 

を使用している場合にのみ、あなたの4つの要素のタプルにアクセスするために、パラメータに直接パターンマッチングを持っています。

この例では、リストを使用してより簡潔なコードを作成しますが、効率的ではありません。

関連する問題