[Haskell] 请教一个类型转换的问题
- Prelude> let l=[1..2]
- Prelude> map (x -> 1/x) l
- <interactive>:1:11:
- No instance for (Fractional Integer)
- arising from a use of `/' at <interactive>:1:11-13
- Possible fix: add an instance declaration for (Fractional Integer)
- In the expression: 1 / x
- In the first argument of `map', namely `( x -> 1 / x)'
- In the expression: map ( x -> 1 / x) l
- Prelude> map (x -> 1/x) [1..2]
- [1.0,0.5]
- Prelude>
复制代码
- 为什么直接 map 到 [1..2] 上可以,但 map 到绑定到 l 上的 [1..2] 就不行呢?
- Possible fix: add an instance declaration for (Fractional Integer)
这里说的 instance 指的是什么? 是 / 这个运算吗?
谢谢。
[ 本帖最后由 win_hate 于 2009-1-20 21:59 编辑 ]
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(6)
嗯,Integer 是 Haskell 的无穷精度整形数,Int 类似于 C 的 int.
我明白了。最初的类型是 Int,要 toInteger 后才能 fromInteger.
谢谢。
我再试一下。
这个忘说了,做下类型转换就可以了。例如把 f 定义为 f x = x / fromInteger n
明白了。我下面的需求应该很普遍,应该不用修改 Integer 类。我试过 fromInteger,还是不行。不知道哪里搞错了。
我有一个整数列表,类型为 [Int]。
我想把一个函数 f x=x/n map 到这个列表上,n 的类型是个 Int,希望能得到一个列表,类型为 [Double]。
不知道该怎么做了。
[ 本帖最后由 win_hate 于 2009-1-20 22:35 编辑 ]
这好像和 ghci 自动做的一些转换有关系。你用 :t 看看 [1..2] 和 l 的类型,就会发现它们并不一样。
这个 instance 是和 type class 对应的。type class 给出了运算的接口,instance 给出具体的实现。Haskell 中运算符重载就靠这个了。
上面这个错误信息的意思是对于 type class Fractional 没有和 Integer 对应的实现,在 GHCi 中,type class 的查看可通过 :i, 如
可以看到,type class Fractional 定义了三个运算,(/), recip, 和 fromRational,当前环境中有两个实现(instance),Fractional Double 和 Fractional Float。
你想要 (/) 用在 Integer 上(l 的类型为 [Integer]),就得添加一个 instance Fractional Integer,也即对 Integer 实现 Fractional 的那三个操作。
[ 本帖最后由 MMMIX 于 2009-1-20 22:24 编辑 ]