2017-10-15 11 views
2

簡単な質問です。F#なぜこの返品の種類がありますか?

私は2つの文字列とintをとり、n行の新しい文字列を返し、2つの入力文字列を交互にする関数を持っています。

let rec f s1 s2 n = function 
    | s1 when n > 0 -> s1 + "\n" + f s2 s1 (n-1) 
    | s2 when n > 0 -> s2 + "\n" + f s1 s2 (n-1) 

f "ab" "cd" 4 

それを呼び出すと、私は現在、私の方法のエラーを取得し、私はなぜわからないab\ncd\nab\ncd

を返す必要があります。何かヒント?

UPDATE:

結局のところ、それは匿名functionを使用することによって引き起こされています。上記機能は、正しい方向へのステップであるかもしれないが、以下の実装は、TheQuickBrownFoxにより指摘したように正しいものである:

let rec f s1 s2 n = 
    match s1 with 
    | _ when n <= 0 -> "" 
    | s1 when n > 0 -> s1 + "\n" + f s2 s1 (n-1) 
    | s2 when n > 0 -> s2 + "\n" + f s1 s2 (n-1) 

UPDATE 2:match式にそれを変更すると、それを解決します。

let rec f s1 s2 n = 
    if n <= 0 then "" 
    else s1 + "\n" + f s2 s1 (n-1) 
+0

あなたのアップデートに合わせて自分の答えを更新しました。 – TheQuickBrownFox

答えて

3

functionキーワードは一つの引数を持つ新しい匿名関数(またはラムダ)を作成し、ストレートパターンマッチに入ります。

したがって、f関数はs1,s2およびnの値をとり、値として別の関数を返します。これは、これを書い同じです:

let rec f s1 s2 n = 
    fun x -> 
     match x with 
     | s1 when n > 0 -> s1 + "\n" + f s2 s1 (n-1) 
     | s2 when n > 0 -> s2 + "\n" + f s1 s2 (n-1) 

それはあなたの関数は、私はあなたのための修正を提案することができないやろうとしているものを私に明確ではありません。私は今のところfunctionのキーワードから離れて滞在することをお勧めします。このフォームでこの関数を書いてみて、それが助けかどうかを確認:

let rec f s1 s2 n = 
    match ... with 
    ... 

UPDATE:

あなたの更新の実装では、あなたが実際にすべてのパターンマッチングを使用していません。パターン部分は効果的に破棄され、when節がすべての作業を行っています。さらに、n <= 0またはn > 0のいずれかがあるため、最後のブランチに到達することは不可能です。あなたの新しい機能は、より簡単に書くことができます:

let rec f s1 s2 n = 
    if n <= 0 then "" 
    else s1 + "\n" + f s2 s1 (n-1) 
+0

誰かがF#の質問を投稿するたびに通知を受け取りますか? :p – Khaine775

+1

うん。タグにカーソルを合わせると、電子メールで購読することができます:) – TheQuickBrownFox

+0

functionキーワードを省略して、適切な解決策を得ることができました。 – Khaine775

関連する問題