当前位置:  开发笔记 > 人工智能 > 正文

Haskell中的函数类型

如何解决《Haskell中的函数类型》经验,为你挑选了1个好方法。

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 - 未定义的类"字符串"



1> Carsten..:

编译器错误是因为(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?

推荐阅读
黄晓敏3023
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有