2016-02-25 56 views
2
// Learn more about F# at http://fsharp.org 
// See the 'F# Tutorial' project for more help. 

open System 

let highLowGame() = 
    let rng = new Random() 
    let secretNumber = rng.Next() % 100 + 1 

    let rec highLowGameStep() = 
     printfn "Guess the secret number: " 
     let guessStr = Console.ReadLine() 
     let guess = Int32.Parse(guessStr) 

     match guess with 
     | _ when guess > secretNumber 
      -> (printfn "The secret number is lower") 
       highLowGameStep() 
     | _ when guess = secretNumber 
      -> (printfn "You've guessed correctly!") 
       () 
     | _ when guess < secretNumber 
      -> (printfn "The secret number is higher") 
       highLowGameStep() 

    highLowGameStep() 

[<EntryPoint>] 
let main argv = 
    printfn "%A" argv 
    0 // return an integer exit code 

我檢查這些代碼就像一千次,我得到一個警告說摹uess is incomplete on pattern matching這肯定是不行的......我也得到一個錯誤說value is not a function and cannot be applied.這個值不是一個函數,不能被應用 - F#

我直接從一本書中複製出來,所以我不明白這是不是編譯?!

+0

這是一本書的示例代碼?!?它在無效的用戶輸入上崩潰,有一行什麼都不做,導致編譯器警告,沒有任何好處的無用括號和奇怪的格式化,濫用通配符模式匹配代替'if-then-elif',並創建一個非一次性用'new'鍵入。即使原文中的空格應該是正確的,我是否可以建議獲得另一本書? – Vandroiy

回答

3

如果在printfn語句之後添加分號,它將起作用。我相信它沒有被編譯的原因是因爲你試圖從比賽中返回一個printfn和另一個函數(highLowGameStep)。

+0

vcsjones說這是空白,並工作,但後來我試過你的解決方案,它的工作呢! Gah,F#令人困惑 –

+1

@LukeXu都是可以接受的解決方法。添加分號修復了編譯器無法正確分離語句的問題。添加分號是明確的方式。 – vcsjones

+0

@LukeXu我絕對知道這種感覺。我剛剛開始學習... – Ringil

6

模式匹配上的空格是錯誤的。它應該是這樣的:

match guess with 
| _ when guess > secretNumber -> 
     (printfn "The secret number is lower") 
     highLowGameStep() 
| _ when guess = secretNumber -> 
     (printfn "You've guessed correctly!") 
     () 
| _ when guess < secretNumber -> 
     (printfn "The secret number is higher") 
     highLowGameStep() 

修復了編譯錯誤。至於警告,編譯器正在做出一個最佳猜測,但它無法確定所有情況都被實際覆蓋。如果要修復警告,可以添加另一個案例:

| _ -> invalidOp("Invalid input") 
+0

世界上有什麼......我的空白怎麼錯了。你是對的...我將它從空格改爲了製表符,它似乎可以工作 –

+0

@LukeXu我特指' - >',注意它們在最上面。在F#中使用選項卡可能會很棘手。 – vcsjones

+0

啊......得到了它的感謝! –