2012-04-03 34 views
-4

对不起我的第一篇哈斯克尔警卫和Co

  • 一个。输入一个整数值;
  • b。如果输入数量小于零,则输出负值;
  • c.outputs如果输入数字恰好为零,则为零;
  • d。如果输入数字大于零,则输出自然数。

有人可以帮我。我究竟做错了什么?

snum :: Int->String 
snum x 
| x > 0 = "Natural" 
| x == 0 = "Zero" 
| otherwise = "Negative" 

,为什么我认为,“因为哈斯克尔这样告诉我;)

SNUM 4或0或(-5)给了我

Ambiguous occurrence `snum' 
It could refer to either `Main.snum', defined at snum.hs:2:1 
         or `Prelude.snum', imported from Prelude 
+4

没有人可以帮助你,因为没有办法知道你做错了什么。 http://sscce.org/ – Marcin 2012-04-03 11:39:11

+0

@igrec:请更好地解释你自己。那段代码的问题究竟是什么?我试着回答你,但这只是一个猜测,因为如果你不告诉我们,我真的不知道你对这段代码有什么期望:) – 2012-04-03 11:47:55

+1

@igrec你为什么认为你做错了什么?你做了一些事情,你会期望发生一些事情,但相反,其他事情会发生。你需要告诉我们所有三条信息。 – dave4420 2012-04-03 11:49:49

回答

4

你的代码是正确的,而且作品为了我。 也许您的担心可能与负数有关拨打电话snum -1?在这种情况下,你必须用括号括起来,否则haskell会认为-是一个二进制减法运算符(因此它会尝试从snum中减去1,这是一个函数而不是数字):snum (-1) == "Negative"将返回True

5

已经有一个预定义的值snum

可能的解决方法:

  1. 重命名功能,例如

    mySnum :: Int->String 
    mySnum x 
    | x > 0 = "Natural" 
    | x == 0 = "Zero" 
    | otherwise = "Negative" 
    
  2. 隐藏预定义的snum,通过在程序开始加入这一行:

    import Prelude hiding (snum) 
    

但我很好奇:我从来没有听说过的预定snum前。你用什么来运行你的Haskell程序? GHC?拥抱?还有别的吗?哪个版本?

+0

哇!我已经杀了两个小时,想什么是错的?感谢男士们和女士们!关于'snum'我改变了在线发布的函数名称。它有另一个名字在我的脚本;))愚蠢的我,再次感谢 – igrec 2012-04-03 13:01:48

+0

@igrec:不要忘记接受他的回答;) (@dave:+1 btw) – 2012-04-03 14:06:58

+0

所以,你编辑错误信息? – pat 2012-04-03 14:46:17