2015-12-20 155 views
0

Haskell中的类型问题。 我尝试从Prolog移动到Haskel。 我必须从字符串表示中计算算术表达式。我在Haskel上编写了与Prolog程序相匹配的递归算法。原因Haskel要求列表中的所有元素必须是一种类型,不可能像Prolog中那样混合操作符号和数字,所以我使用[String]类型来表示算术表达式。为了执行计算,必须将数字的符号表示转换为整型,但将结果类型推断为浮点型。每个操作的结果必须反向转换为字符串,因为它是字符串元素的类型。Haskell编译器(HUGS 98)阻止我的程序。 我的错误是什么? 。Haskell中的函数类型

cc   :: (String b) => [String] -> b 
cc (a:"*":b:t) = cc(c:t) 
where c=show(read a * read b) 
cc (a:"/":b:t) = cc(c1:t) 
where c1=show(read a/read b) 
cc (a:"-":t) = show(read a - read(cc t)) 
cc (a:"+":t) = show(read a + read (cc t)) 
cc (a:[]) = a 
cc [] = 0 

错误文件:\ e3.hs:18 - 未定义类“字符串”

+2

字符串确实不是一个类。你想用'(String b)=> [String] - > b'表达什么? –

+0

请记住,在'a:'+':b:t'中,a和b都是单个字符,所以在计算10 + 12时会遇到一些困难。 –

+0

@ n.m。 ...这不会是一个问题,因为它不是“+”而是“+”';) – Carsten

回答

4

编译器错误是因为(String b) => ...部分在第一线这将表明String的是b约束 - 我不认为你想在这里表达。

如果我找到你的权利,你想要一份String的清单,并评估到Float对不对?

在这种情况下,你指望它这应该工作:

cc :: [String] -> Float 
cc (a:"*":b:t) = cc (c:t) 
    where c = show (read a * read b) 
cc (a:"/":b:t) = cc (c1:t) 
    where c1 = show (read a/read b) 
cc (a:"-":t) = read a - cc t 
cc (a:"+":t) = read a + cc t 
cc (a:[]) = read a 
cc []  = 0 

正如你可以看到我删除了相当长的一段你read/show对作为了他们不需要和简化签名颇有几分(目前已经有评论到)

下面是一个例子:

λ> cc ["5","+","6","*","7"] 
47.0 

这似乎工作;)


PS:也注意到,你错过了一些情况下,像在你的模式cc ["10","10"] - 也许你应该添加一个包罗万象的,如:

cc _   = error "uh - what?" 

到最后得到的东西,如:

λ> cc ["10","12"] 
*** Exception: uh - what?