2017-01-26 2 views
0

。整数リストをとり、リストのすべての要素の合計を返す関数を記述します。リストが空の場合はNoneを返します。Ocaml:intリスト内のすべての整数を加算し、intとして出力する。Option

これが今の私のコードです:

let rec sum (xs: int list) = 
    match xs with 
    | [] -> None 
    | [x] -> Some x 
    | hd::tl -> let m = (hd + (sum tl)) in 
       Some m 
;; 

問題は、私はエラーを取得せずに最後の要素を追加する方法を見つけるように見えることができないということです。
これは私のエラーです。 エラー:この式はint型ですが、式は 'a'型の式が必要です。

答えて

1

sumへの再帰呼び出しは、実際にはint optionを返します。あなたは関数の作成者であり、その型を返すようにコード化しています:-) intを返すヘルパー関数を書くか、返り値sumからintを抽出するか、このような何か:

let tlsum = 
    match sum tl with 
    | None -> (* figure this part out *) 
    | Some n -> (* figure this part out *) 
0

私は漠然となりますので、割り当てのようになります。

そのための最も簡単な方法は、まず「通常」の合計を返すタイプint list -> intの関数を定義するために、おそらくです(空の場合は0)。この関数は再帰的で、0は基本ケースに対応します。

次に、引数が空であるかどうかをチェックし、それに基づいて正しいことを行うタイプのint list -> int optionの別の関数を記述します。

[]を処理する必要があるケースが2つあります。リスト内の唯一の要素であり、空でないリストの最後にある場合です。

1

intオプションを2つ追加することができます。

let sum l = 
    let (+) a b = 
    match (a,b) with 
     | (None,x) | (x,None) -> x 
     | (Some x,Some y)  -> Some (x+y) 
    in 
    let convert a = Some a in 
    let opt_l=List.map convert l in 
    List.fold_left (+) None opt_l 

テスト

# sum [];; 
- : int option = None 
# sum [1;2];; 
- : int option = Some 3 
関連する問題