2017-05-12 37 views
0

这是我第三次今天运行,这个时髦词语函数式语言F#是快把我逼疯然而,当我得到的某些位权的感觉很不错表达预计将有一个类型,但是这里的类型为字符串

早些时候,我有一个递归循环的问题有人提出了一个前进的方向,现在我得到了上述错误,问题是我知道我的类型将是一个字符串,所以为什么编译器抱怨?

目的是把学习实践12周,所以我想在基本的聊天机器人工作至今我能坚持一个基本层面的对话,但是,也有几件事情,仍然是我的范围,例如

为什么我不能打电话给我的类型? IUserError传递用户输入,并检查他们是否说过某些不在我的主题列表中,然后用无效输入回应。

我的其他问题是保持简单我想将所有输入转换为小写字符串,这也被证明是一个挑战。

然后有数字在对话的某个阶段,用户由于某种原因到达房间的位置,我可以找到一种方法,而不是做这个检查。

网上很少有教程,我正在使用的书不能很好地解释。我很高兴与我有什么迄今取得

,如果有人可以解释我在哪里这一点,因为在C#这一切都已经走了,并撒去错了。:(

这里是我的整个代码随意讨论:

open System 
open System.IO 
open System.Speech.Synthesis 

// required for regular expression 
open System.Text.RegularExpressions 
    // init randomizer 
    let rand = new Random() 
    // recursive response function find the first match with a key token 
    // response back acordingly 

    // Initialise a new instance of SpeechSynthesizer 
    let voice (sentence: string) = 

    use speech = new SpeechSynthesizer(Rate= -3) 
    //speech.SelectVoice("Microsoft Huihui Desktop") 

    speech.Speak(sentence) 

    // define functions of set list campus area 
    let mpCampusArea = Set.ofList ["Cisco Labs"; "The Bridge"; "Security 
    Area"; 
    "Mac Labs"; "Open Access"] 


    //active patterns 

    //method for checking room number                 

    let chkroom() = 
    let roomNumbers = seq { 
     yield 158 
     yield 123 
     yield 333 } 

    printfn "Room not found could it be :" 
    for items in roomNumbers do 
    printfn "%A" items 


    let (|Campuses|None|) users = 
    if Regex.Match(users,".*(MP?|mp|Curzon|curzon|ParkSide?).*").Success 
    then Campuses 
    else 
    None 

    // Apply Active pattern 
    let(|Repair|None|) input = // any sentence with broken|break|damaged is 
    require repair 
    if Regex.Match(input , ".*(broken?|break|damaged?).*").Success 
    then Repair 
    else 
    None 

let (|ParkSide|None|) input = 
if Regex.Match(input , ".*(P158|P159|P160).*").Success 
then ParkSide 
else 
    None chkroom 


let (|RoomLocation|None|) str2 = 
if Regex.Match(str2, ".*(158|140|150).*").Success 
then RoomLocation 
else 
    None chkroom 


// Define an active recognizer for keywords that express salutation. 
let (|Bye|Answer|NoSubject|MyGirlFriend|Faulty|None|) input = 
match input with 
    | "goodbye" | "bye" | "go" |"get lost" 
      -> Bye 
    | "who" | "how" | "when" |"where" 
      -> Answer 
    | "car" |"what" |"name" |"bcu" 
      -> NoSubject 
    | "lonely" |"love" | "friendship" 
      -> MyGirlFriend 
    | "device" |"software" |"phone" 
     -> Faulty 
    | _  
      -> None 

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

// select possible likely hood response based on random number for hello 
subject 
// Interact with the user 
// Subject faulty software and Hardware 
let faulty_response (str:string) = 
    let x = rand.Next(5) 
    match x with 
    | 0 -> "My advice is to restart the software/hardware?" 
    | 1 -> "My advice is relax it will be sorted." 
    | 2 -> "My advice is bin your device/software." 
    | 3 -> "Please throw your software/hardware in the recycle bin" 
    | 5 -> "Kiss your device/software as this always works for me." 
    | _ -> "" 


    let good_bye_response() = 
    let b = rand.Next(5) 
    match b with 
    | 0 -> "Good bye Babe" 
    | 1 -> "Thank God " 
    | 2 -> "We have to be positive love BCU" 
    | 3 -> "Live is beautiful but you are a smelly poo little fella BYE!" 
    | 4 -> "Good bye and thanks for complainting" 
    | _ -> "" 


    let answer_response() = 
     let x = rand.Next(10) 
     match x with 
     | 0 -> "Please go and complait to Waheed Rafiq" 
     | 1 -> "Please go and see Emmett Cooper" 
     | 2 -> "So you want me to kick a fuss?" 
     | 3 -> "What a waste of time" 
     | 4 -> "Please go and see BCU tech department" 
     | 5 -> "OMG and so what" 
     | 6 -> "Jump of the roof it will most likely help us all" 
     | 7 -> "Let's talk about the toliet shall we" 
     | 8 -> "why don't you use pattern matching with regular expressions!" 
     | 9 -> "Speak to the Queen she will mostly likely deals with BCU 
     complaints" 
     | _ -> "" 

    let none_response (str:string) = 
    let n = rand.Next(10) 
    match n with 
    | 0 -> "What would you"+ str + "like to chat about ?" 
    | 1 -> "I do not understand please ask again !" 
    | 2 -> "How about you Speak english and I log your helpdesk call yeah?" 
    | 3 -> "Sorry to hear that. Are you sure you want to complaint ?" 
    | 4 -> "This is a complaint Chat bot where you log helpdesk calls. 
    Please Refer to Cortana for her services.!" 


    | 5 -> "Let just complaint yeah for the sake of complaining ?" 
    | 6 -> "OKay what is your complaint about ?" 
    | 7 -> "Are you a human because you certainly do not behave like one!" 
    | 8 -> "The moon is epic. What is broken ?" 
    | 9 -> "Do you always complaint? Try logging it like my PC is broken 
     yeah !" 
    | _ -> "" 


    type Day = 
    | Monday 
    | Tuesday 
    | Wednesday 
    | Thursday 
    | Friday 
    | Saturday 
    | Sunday 

let isWeekend x = 
    match x with 
    |Saturday |Sunday -> true 
    |_-> false 



// using regular expression to tokenisse line of text 
let matchWords = Regex(@"\w+") 

let token (text:string) = 
    text.ToLowerInvariant() 
    |> matchWords.Matches 

    // Crossing the stream 
    type IUserError = 
     interface 
    end 

    type Error = { ErrorMessage:string; ErrorCode:int} 
     interface IUserError 

    type Success = { Status:string } 
      interface IUserError 

    let error = {ErrorMessage = "Incorrect input please enter a subject 
    phase"; 
    ErrorCode = 250} :> IUserError 

    match error with 
    | :? Error as e -> printfn "Code %i \n Message: %s" e.ErrorCode 
    e.ErrorMessage 
    | :? Success -> printfn "Success" 
    |_ -> failwith "Invalid option" 

    //printfn "%A" error 

    //recursive response function 
    let rec response (token: string) (str: string) = 
    match token with 
    | Bye 
     -> good_bye_response() 

    | Answer 
     -> answer_response() 
    | Faulty 
      -> faulty_response str 
    | Repair 
     -> 
      sprintf "%s" "Which Campus is the device in?" 
    | Campuses 
     -> sprintf "%s" "Which room is the device in?" 
    | RoomLocation 
     -> sprintf "%s" "Your call is log. Do you wish to quit?" 
    |_ when token.Contains("yes") -> "Okay logging you out" 
    |_ when token.Contains("no") -> answer_response() 
    | NoSubject 
      -> none_response str 

    | 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() = 
    let valueInput = Console.ReadLine() 
    printf "Helpdesk-BCU Response --> %s \n" (response "" valueInput) 
    let keepRunning, message = response valueInput 
    printfn ">> %s" message 
    if keepRunning then chat() 




    //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" 

// call back feature for the chatbot 


//[<EntryPoint>] 
    //let main argv = printfn "%A" argv 


// Advance expression lamba [ Emmett helps required] 

let ifancyHerList = 
    [ 
    ("Sara",1); ("Saima",2); ("Zoe",3); ("Scarlett",4); 
    ("Jennifer",5);("Sandra Bullock",6) 
    ] 

let myGirlFriend() = 
List.pick (fun funToNight -> 
    let n = rand.Next(10) 
    if (snd funToNight) = n 
    then Some (fst funToNight) 
    else None 
) ifancyHerList 

    //match myGirlFriend with 
    //| Some name -> printfn "Your date for tonight is %A lucky fella" name 
    //| None  -> printfn "You don't have a date tonight!" 
// 

    printfn "Welcome to the BCU Complaint Chat Bot" 
    printf "Please enter your first name -->" 
    let data = Console.ReadLine() 

//let rec complaints n = 
// printf "%s what do you want to complain about? -->" data 



//complaints() 
chat() 

printfn "The avaialbe areas at Millennium point are: %A" mpCampusArea 
printfn "Which day is Weekend on?" 
let x = Console.ReadLine() 



0 

任何帮助/指针/任何东西,因为这是我发疯

我要发布一个直接链接到项目文件,如果你想下载它,并有一个仔细看看,多appericate您支持。

链接到project file

+1

在哪一行,你得到的错误? –

+1

原始代码中的缩进是可以的,但是你问题中的缩进全部搞砸了,这使得我们很难回答你的问题,因为我们看不到代码实际上在做什么。将代码粘贴到堆栈溢出以便缩进将*正确*的方法是使用输入框中的“{}”按钮。你粘贴你的代码,然后你选择整个事物并按下'{}'按钮,并且整个选定块被缩进4个空格(这就是Stack Overflow中的代码块)。 – rmunn

+0

如果你可以编辑你的问题并修正缩进,那对那些试图帮助你的人来说是一个很大的帮助 - 我们实际上可以看到你的代码是应该做的。 – rmunn

回答

3

我不确定使用接口是你想在这里做什么。您没有为IUserError定义任何抽象方法,但是稍后您可能会保存该方法。此外,你有一个悬挂在那里没有功能的块匹配。

这里是我的,你可以做什么解释:

// Crossing the stream 

type Error = { ErrorMessage:string; ErrorCode:int} 
type Success = { Status:string } 

type UserError = 
    | Error of Error 
    | Success of Success 

let printResponse (error:UserError) = 
    match error with 
    | Error (e) -> printfn "Code %i \n Message: %s" e.ErrorCode e.ErrorMessage 
    | Success _ -> printfn "Success" 
    |_ -> failwith "Invalid option" 

let error = Error {ErrorMessage = "Incorrect input please enter a subject phase"; ErrorCode = 250} 

使用FSI评估printResponse,它应该是这样的:

> printResponse error;; 
Code 250 
Message: Incorrect input please enter a subject phase 
val it : unit =() 
+0

谢谢你回来,我将在今天晚些时候尝试这个,回到你身边。我的代码看起来完全混乱吗? – Wazzie

相关问题