[Haskell] 请教一个类型转换的问题

发布于 2022-08-10 07:17:38 字数 975 浏览 14 评论 6

  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 编辑 ]

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(6

深空失忆 2022-08-20 15:39:49

原帖由 win_hate 于 2009-1-20 22:57 发表
我明白了。最初的类型是 Int,要 toInteger 后才能 fromInteger.

嗯,Integer 是 Haskell 的无穷精度整形数,Int 类似于 C 的 int.

小姐丶请自重 2022-08-20 14:41:16

我明白了。最初的类型是 Int,要 toInteger 后才能 fromInteger.

谢谢。

清引 2022-08-20 13:12:31

原帖由 MMMIX 于 2009-1-20 22:34 发表

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

我再试一下。

我一直都在从未离去 2022-08-20 10:29:52

原帖由 win_hate 于 2009-1-20 22:28 发表
我有一个整数列表,类型为 。

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

不知道该怎么做了。

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

恬淡成诗 2022-08-19 01:52:33

你想要 (/) 用在 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 编辑 ]

吃→可爱长大的 2022-08-17 23:52:52

原帖由 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 编辑 ]

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文