2017-05-12 8 views
0

をFを試してみることができませんでした。私はこの試みをしているかどうかわかりませんが、パターンマッチと何らかの理由で再帰的に再帰的に呼び出すことができません。再帰的な関数f#

// Define my active recognizer for keywords 
let(|MyGirlFriend|Bye|) input = 
    match input with 
    |"lonely|"love"|"friendship" 
     -> MyGirlFriend 
    |"goodbye"|"bye"|"go"| 
     -> Bye 
    |_ 
     -> None 

上記のコードが正しいと思います。

//recursive response function 

let rec response (token: string) (str: string) = 
    match token with 
    | Bye 
     -> good_bye_response() 
    | RoomLocation 
     -> sprintf "%s" "Your call is log. Do you wish to quit?" 
    |_ when token.Contains("yes") -> "good bye" 0 
    |_ when token.Contains("no") -> answer_response() 
    | None when (str.IndexOf(" ") > 0) 
     -> response (str.Substring(0,str.IndexOf(" "))) 
        (str.Substring(str.IndexOf(" ")+1)) 
    | None when (str.IndexOf(" ") < 0) 
     -> response str ""  

私の機能は次のとおりです。

let rec chat() = 
    if Break = false then 
    let valueInput = Console.ReadLine() 
    printf "Helpdesk-BCU Response --> %s \n" (response "" valueInput) 
    if Break = false then 
    chat() 
    else 
     ChatEnd() 

let BCU_response (str: string) = 
    if (str.IndexOf(" ") > 0) then 
    response (str.Substring(0,str.IndexOf(" "))) (str.Substring(str.IndexOf(" 
    ")+1)) + "\n" 
    else 
     response str "" + "\n" 

ここでの問題のカップル| _ときtoken.Contains( "はい") - >の出口としてのF#で使用されているゼロ0 "さようなら"ここで私は赤い線を取得し、式は文字列型でなければならないが、int型であることを示します。ゼロはint型です。

再帰的ループを終了するにはどうすればよいですか?コード内のマイナーな問題のかなり多くがありますので

いかなるsugguestionは、完全にあなたが苦労しているものを一部明らかになっていない

+0

インデントがオフです。正してください。 –

答えて

2

最も歓迎されるであろう。 chat機能は、別の質問をするために自分自身を再帰的に呼び出して、これはtrueある場合 -

open System 

let (|Bye|Other|) input = 
    match input with 
    | "goodbye" | "bye" | "go" -> Bye 
    | _ -> Other 

let response (token: string) = 
    match token with 
    | Bye -> false, "bye!" 
    | Other -> true, "sorry, I didn't get that" 

let rec chat() = 
    let input = Console.ReadLine() 
    let keepRunning, message = response input 
    printfn ">> %s" message 
    if keepRunning then chat() 

response機能は今もブールを返します。しかし、再帰を行う方法を示し、最小限の作業例では、このようなものです。それ以外の場合は、それ以上の質問をせずに戻ります。

+0

ありがとう、私は本当に多くのことを学ぶ必要があります、あなたは基本的な周りにあなたの頭を得ることができますこの言語はそれほど悪くはありません。再帰はある意味でループを再帰的な方法で偽になるまで繰り返し続けるループです。While(真)は何でも正しいですか? – Wazzie

+1

はい、再帰は非常にループに似ています。whileループと可変変数を使用して 'chat'関数を代わりに書くことができます。 「走っているうちに...」。あなたは、 'let mutable running = true'を使って可変変数を定義し、最終的に' running < - false'を使ってfalseに設定する必要があります。 –