2012-02-11 100 views
0
answerFalse::Int->IO() 
answerFalse hp=do 
      hp-- 
      if hp<=0 then 
       putStrLn"================Game Over================" 

      else 
       print(hp) 

我已經和值3 聲明馬力爲INT現在我的問題是,當我把「hp--」,它顯示錯誤哈斯克爾減法錯誤

Couldn't match expected type `IO a0' with actual type `Int' 

,但如果我把「--hp 「,結果打印是3不是2.

我也試過讓hp = hp-1,系統卡在那裏。

+3

Haskell不是C.你不能簡單地去改變變量的值! – Thomas 2012-02-11 16:13:40

+4

Haskell是一個函數式語言,而不是一個命令式的語言,所以像 - 和++這樣的東西將不起作用。 – mrlee 2012-02-11 16:15:45

+0

感謝您的解釋.. – user1151874 2012-02-11 16:29:47

回答

6

你不能在Haskell中修改變量。 hp++++hp(或hp----hp)根本不能在Haskell中工作; --hp編譯的原因是--創建了註釋hp部分的註釋。

你正在嘗試做的是這樣的:

answerFalse hp = 
    if hp - 1 <= 0 
    then putStrLn "================Game Over================" 
    else print hp 

你也可以像這樣做,通過創建一個新的變量:

answerFalse hp = do 
    let newHp = hp - 1 
    if newHp <= 0 
    then putStrLn "================Game Over================" 
    else print hp 

您需要通過查看你的基本的Haskell知識閱讀初學者教程。 This question爲您提供優秀的資源。

+0

感謝您的鏈接和解釋,這是我第一次學習功能語言。再次感謝! – user1151874 2012-02-11 16:25:16

+0

和'hp - '在*'hp'之後引入註釋*。在'do'上下文中,'hp'預計有'IO a0'類型,其中'a0'是一些任意類型,這並不重要,因爲該值沒有綁定。但是,'hp'的類型爲'Int',這導致了無法將'IO a'與'Int'匹配的錯誤。 – pat 2012-02-12 09:19:04

0

像i ++這樣的東西可以通過使用State monad在Haskell中建模。你可以看看例子haskellwiki