2012-02-11 95 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