免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 4806 | 回复: 6
打印 上一主题 下一主题

[Haskell] 请教一个类型转换的问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-01-20 21:58 |只看该作者 |倒序浏览

  1. Prelude> let l=[1..2]
  2. Prelude> map (\x -> 1/x) l

  3. <interactive>:1:11:
  4.     No instance for (Fractional Integer)
  5.       arising from a use of `/' at <interactive>:1:11-13
  6.     Possible fix: add an instance declaration for (Fractional Integer)
  7.     In the expression: 1 / x
  8.     In the first argument of `map', namely `(\ x -> 1 / x)'
  9.     In the expression: map (\ x -> 1 / x) l
  10. Prelude> map (\x -> 1/x) [1..2]
  11. [1.0,0.5]
  12. 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 编辑 ]

论坛徽章:
95
程序设计版块每日发帖之星
日期:2015-09-05 06:20:00程序设计版块每日发帖之星
日期:2015-09-17 06:20:00程序设计版块每日发帖之星
日期:2015-09-18 06:20:002015亚冠之阿尔艾因
日期:2015-09-18 10:35:08月度论坛发贴之星
日期:2015-09-30 22:25:002015亚冠之阿尔沙巴布
日期:2015-10-03 08:57:39程序设计版块每日发帖之星
日期:2015-10-05 06:20:00每日论坛发贴之星
日期:2015-10-05 06:20:002015年亚冠纪念徽章
日期:2015-10-06 10:06:482015亚冠之塔什干棉农
日期:2015-10-19 19:43:35程序设计版块每日发帖之星
日期:2015-10-21 06:20:00每日论坛发贴之星
日期:2015-09-14 06:20:00
2 [报告]
发表于 2009-01-20 22:16 |只看该作者
原帖由 win_hate 于 2009-1-20 21:58 发表

#  为什么直接 map 到 [1..2] 上可以,但 map 到绑定到 l 上的 [1..2] 就不行呢?

这好像和 ghci 自动做的一些转换有关系。你用 :t 看看 [1..2] 和 l 的类型,就会发现它们并不一样。
# Possible fix: add an instance declaration for (Fractional Integer)

这里说的  instance 指的是什么? 是 / 这个运算吗?

这个 instance 是和 type class 对应的。type class 给出了运算的接口,instance 给出具体的实现。Haskell 中运算符重载就靠这个了。

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

上面这个错误信息的意思是对于 type class Fractional 没有和 Integer 对应的实现,在 GHCi 中,type class 的查看可通过 :i, 如
Prelude> :i Fractional
class (Num a) => Fractional a where
  (/) :: a -> a -> a
  recip :: a -> a
  fromRational :: Rational -> a
          -- Defined in GHC.Real
instance Fractional Double -- Defined in GHC.Float
instance Fractional Float -- Defined in GHC.Float

可以看到,type class Fractional 定义了三个运算,(/), recip, 和 fromRational,当前环境中有两个实现(instance),Fractional Double 和 Fractional Float。

你想要 (/) 用在 Integer 上(l 的类型为 [Integer]),就得添加一个 instance Fractional Integer,也即对 Integer 实现 Fractional 的那三个操作。

[ 本帖最后由 MMMIX 于 2009-1-20 22:24 编辑 ]

论坛徽章:
0
3 [报告]
发表于 2009-01-20 22:28 |只看该作者
你想要 (/) 用在 Integer 上(l 的类型为 [Integer]),就得添加一个 instance Fractional Integer,也即对 Integer 实现 Fractional 的那三个操作。


明白了。我下面的需求应该很普遍,应该不用修改 Integer 类。我试过 fromInteger,还是不行。不知道哪里搞错了。

我有一个整数列表,类型为 [Int]。

我想把一个函数 f x=x/n map 到这个列表上,n 的类型是个 Int,希望能得到一个列表,类型为 [Double]。

不知道该怎么做了。

[ 本帖最后由 win_hate 于 2009-1-20 22:35 编辑 ]

论坛徽章:
95
程序设计版块每日发帖之星
日期:2015-09-05 06:20:00程序设计版块每日发帖之星
日期:2015-09-17 06:20:00程序设计版块每日发帖之星
日期:2015-09-18 06:20:002015亚冠之阿尔艾因
日期:2015-09-18 10:35:08月度论坛发贴之星
日期:2015-09-30 22:25:002015亚冠之阿尔沙巴布
日期:2015-10-03 08:57:39程序设计版块每日发帖之星
日期:2015-10-05 06:20:00每日论坛发贴之星
日期:2015-10-05 06:20:002015年亚冠纪念徽章
日期:2015-10-06 10:06:482015亚冠之塔什干棉农
日期:2015-10-19 19:43:35程序设计版块每日发帖之星
日期:2015-10-21 06:20:00每日论坛发贴之星
日期:2015-09-14 06:20:00
4 [报告]
发表于 2009-01-20 22:34 |只看该作者
原帖由 win_hate 于 2009-1-20 22:28 发表
我有一个整数列表,类型为 。

我想把一个函数 f x=x/n map 到这个列表上,n 的类型是个 Int,希望能得到一个列表,类型为 [Double]。

不知道该怎么做了。

这个忘说了,做下类型转换就可以了。例如把 f 定义为 f x = x / fromInteger n

论坛徽章:
0
5 [报告]
发表于 2009-01-20 22:36 |只看该作者
原帖由 MMMIX 于 2009-1-20 22:34 发表

这个忘说了,做下类型转换就可以了。例如把 f 定义为 f x = x / fromInteger n


我再试一下。

论坛徽章:
0
6 [报告]
发表于 2009-01-20 22:57 |只看该作者
我明白了。最初的类型是 Int,要 toInteger 后才能 fromInteger.

谢谢。

论坛徽章:
95
程序设计版块每日发帖之星
日期:2015-09-05 06:20:00程序设计版块每日发帖之星
日期:2015-09-17 06:20:00程序设计版块每日发帖之星
日期:2015-09-18 06:20:002015亚冠之阿尔艾因
日期:2015-09-18 10:35:08月度论坛发贴之星
日期:2015-09-30 22:25:002015亚冠之阿尔沙巴布
日期:2015-10-03 08:57:39程序设计版块每日发帖之星
日期:2015-10-05 06:20:00每日论坛发贴之星
日期:2015-10-05 06:20:002015年亚冠纪念徽章
日期:2015-10-06 10:06:482015亚冠之塔什干棉农
日期:2015-10-19 19:43:35程序设计版块每日发帖之星
日期:2015-10-21 06:20:00每日论坛发贴之星
日期:2015-09-14 06:20:00
7 [报告]
发表于 2009-01-21 00:04 |只看该作者
原帖由 win_hate 于 2009-1-20 22:57 发表
我明白了。最初的类型是 Int,要 toInteger 后才能 fromInteger.

嗯,Integer 是 Haskell 的无穷精度整形数,Int 类似于 C 的 int.
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP