Haskell中的类型问题.我试着从Prolog搬到Haskel.我必须从字符串表示计算算术表达式.我在Haskel上编写了递归算法,与Prolog程序相匹配.原因Haskel要求列表中的所有元素必须是一种类型,不可能将操作符号与数字混合,如Prolog,所以我使用[String]类型来表示算术表达式.要执行计算,必须将数字的符号表示转换为Integer类型,但结果类型推断为float.每个操作的结果必须反向转换为字符串,因为它是字符串元素的类型.Haskell编译器(HUGS 98)推迟了我的程序.我的错误是什么?
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 - 未定义的类"字符串"
编译器错误是因为(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?