2017-10-05 22 views
-2

私は3行目のエラーを取得しています、私のリスト上の私の最初の二つの要素を追加するOCamlのマッチ誤差

をしようとしています、なぜですか?

let addfirsttwo lst = 
    match lst with 
    | List.hd lst + List.hd (List.tl lst) 
;; 
+2

エラーは何ですか?質問の本文やタイトルに含めるようにしてください。 (同じ問題に解決策を見出そうとしている人を考えてください) – user5226582

答えて

1

リストから情報を抽出するための2つの異なる方法を組み合わせています。 1つはList.hdList.tlを使用し、もう1つはパターンマッチングです。

前者では、ほぼ完了です。あなたはそうのようなパターンマッチング を取り除く必要があります:

let addfirsttwo lst = 
    List.hd lst + List.hd (List.tl lst) 

私はあなたの質問がList.hdList.tlが禁止されているいくつかの宿題に関連していること、しかし、想定しています。そして、とにかく、パターンマッチングは知っておくと便利です。 コードの問題は、パターンマッチングを完了しなかったことです。パターンマッチ句は、次の形式をとります。

| <some pattern> -> <some expression> 

パターンは通常、式で使用できる変数を割り当てます。 List.hdを定義する1つの方法は、例えば、あなたの句は、実際のパターンと->がありませんでした

let hd list = match list with 
| head::tail -> head 

です。 、少なくとも構文をあなたのコードを修正する別の方法は、そのように足りない部分を提供することであっただろう:_すべてで任意の値に一致すると、任意の変数を結合しないワイルドカードとして機能し

let addfirsttwo lst = 
    match lst with 
    | _ -> List.hd lst + List.hd (List.tl lst) 

。しかし、それは仮定された宿題の制約を解決するものではない。

hdのパターンがすべての値と一致しないことに注意してください。 List.hdは空でないリストだけをサポートする必要があるため、少なくとも1の長さのリストと一致します。あなたの関数は少なくとも2の長さのリストをサポートする必要があります。そのため、あなたはそのようなリストに一致するパターンがよいでしょう。