gpt4 book ai didi

haskell - 无法从 (Num a) 或 (Floating a) 推导出 (Eq a)。但可以从 (Integral a) 推导出 (Eq a)。为什么?

转载 作者:行者123 更新时间:2023-12-03 21:16:58 25 4
gpt4 key购买 nike

我正在阅读一个haskell 教程(向你学习一个haskell 非常好),我正在玩我根据书中的一个函数编写的这段代码。

reverseNum :: (Num a) => a -> a
reverseNum 123 = 321
reverseNum x = 0

ghci 告诉我它不能从 (Num a) 推导出 (Eq a)。

所以我把第一行改成这个
reverseNum :: (Integral a) => a -> a

它奏效了。这很奇怪,因为我认为要成为 Num 类型类的一部分,你也需要成为 Eq 的一部分。

我又尝试了一件事情来满足我的好奇心,并将前两行改为这个
reverseNum :: (Floating a) => a -> a
reverseNum 1.0 = 0.1

它给了我同样的错误。

我知道您可以通过执行 reverseNum :: (Num a, Eq a) ... 之类的操作来解决此问题但我想知道为什么 Integral 是唯一可以推导出 Eq 的。
这是为什么?

附言我对haskell真的很陌生,所以......要温柔:)

最佳答案

简短的回答

因为这是 Num 的定义在序曲中:

class Num a where
...

Integral 的定义要求类型为 RealEnum :
class (Real a, Enum a) => Integral a where
...

Real意味着 NumOrd ...
class (Num a, Ord a) => Real a where
...

Ord , 自然地, 暗示 Eq :
class Eq a => Ord a where
...

这行意味着为了使某些东西实现 Ord , 它 必须也执行 Eq .或者我们可以说 OrdEq 的子类.反正...

总结是 Num不是 Eq 的子类, 但是 IntegralEq 的子类.

长答案(为什么?)

你可以想象实现 Num以无法实现的方式 Eq .
newtype Sequence = Sequence (Integer -> Integer)

instance Num Sequence where
(Sequence x) + (Sequence y) = Sequence $ \pt -> x pt + y pt
(Sequence x) - (Sequence y) = Sequence $ \pt -> x pt - y pt
(Sequence x) * (Sequence y) = Sequence $ \pt -> x pt * y pt
negate (Sequence x) = Sequence $ \pt -> -pt
abs (Sequence x) = Sequence $ \pt -> abs pt
signum (Sequence x) = Sequence $ \pt -> signum pt
fromInteger = Sequence . const

-- Ignore the fact that you'd implement these methods using Applicative.

在这里, Sequence是表示所有可计算序列的类型。你不能实现 Eq以任何合理的方式,因为序列是无限长的!
instance Eq Sequence where
-- This will never return True, ever.
(Sequence x) == (Sequence y) =
and [x pt == y pt | pt <- [0..]] &&
and [x pt == y pt | pt <- [-1,-2..]]

所以 Num 是有道理的不是 Eq 的子类, 因为有一些有用的类型可以实现 Num但不是 Eq .

关于haskell - 无法从 (Num a) 或 (Floating a) 推导出 (Eq a)。但可以从 (Integral a) 推导出 (Eq a)。为什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18676468/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com