作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在阅读一个haskell 教程(向你学习一个haskell 非常好),我正在玩我根据书中的一个函数编写的这段代码。
reverseNum :: (Num a) => a -> a
reverseNum 123 = 321
reverseNum x = 0
reverseNum :: (Integral a) => a -> a
reverseNum :: (Floating a) => a -> a
reverseNum 1.0 = 0.1
reverseNum :: (Num a, Eq a) ...
之类的操作来解决此问题但我想知道为什么 Integral 是唯一可以推导出 Eq 的。
最佳答案
简短的回答
因为这是 Num
的定义在序曲中:
class Num a where
...
Integral
的定义要求类型为
Real
和
Enum
:
class (Real a, Enum a) => Integral a where
...
Real
意味着
Num
和
Ord
...
class (Num a, Ord a) => Real a where
...
Ord
, 自然地, 暗示
Eq
:
class Eq a => Ord a where
...
Ord
, 它
必须也执行
Eq
.或者我们可以说
Ord
是
Eq
的子类.反正...
Num
不是
Eq
的子类, 但是
Integral
是
Eq
的子类.
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/
我是一名优秀的程序员,十分优秀!