表达式应该有一个类型,但这里有类型String

时间:2017-05-12 20:40:08

标签: f# functional-programming

这是我今天第三次跑步,这个热门词汇功能语言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

任何帮助/指针/任何东西,因为这让我疯狂

如果您希望下载链接并仔细查看,我会直接将链接发布到项目文件中。

指向project file

的链接

1 个答案:

答案 0 :(得分: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 = ()