2

F#と関数型プログラミングを始めたばかりです。タプルを取る関数を作成する方法を知りたいのですが、最初の値は標準のintではなく文字列でなければならないことを定義しています。

例:

文字列を複製する関数、、sn、それを返します。私が今持っているのはこれです:

let rec pow2 = function
    | (s:string,0) -> ""
    | (s:string,n) -> s + pow2(s,n-1)

s:stringこれは機能しますが、すべてのケースを定義するよりも良い方法があると思います。

(私は知っていString.replicateます、これは効果のためではなく、学習のためです)

4

3 に答える 3

7

実際、ここでは型の注釈は必要ありません。最初のパターンマッチの""戻り値は、コンパイラにとって十分なヒントです。

> let rec pow2 = function
    | (s,0) -> ""
    | (s,n) -> s + pow2(s,n-1);;

val pow2 : string * int -> string
于 2013-02-01T02:06:02.223 に答える
4

string最初のケースでのみ型アノテーションが必要です。F#コンパイラは、残りのケースではタプルの最初の要素がaである必要があると推測できます。

let rec pow2 = function
    | (s:string,0) -> ""
    | (s,n) -> s + pow2(s,n-1)

スタイルの問題ですが、次のような関数を作成すると、少し読みやすくなると思います。

let rec pow2 (s, n) =
    match n with
    | 0 -> ""
    | _ -> s + pow2(s, n-1)
于 2013-02-01T02:06:17.627 に答える
4

タプルのタイプが関数定義で指定されている場合は、次のようにすることもできます。

let rec pow2 ((s, n) : string * int) =
    match n with
    | 0 -> ""
    | _ -> s + pow2 (s, n - 1)

タプルの要素は*、明示的な型アノテーションで区切られていることに注意してください。また、Stephenが指摘したように、この例ではn、整数と一致し、文字列("")をに追加するため、型推論システムはタプルの型を理解するのに十分スマートsです。

于 2013-02-01T21:32:55.547 に答える