直到今天我的假设是fromInteger
在Num
班是一个环同态。我假设这是因为 integer is 是共同终结符,所以每个环必须有一个来自 integer 的唯一同态,所以它Num
基本上是标准库的环类,将包含该同态是有道理的。
不过今天我读了法律Num
这一点,锯fromInteger
是不是要同态必需的,但只需要保留身份。因此,例如我们可以实现 Klein 4 群,并fromInteger
映射1
到乘法恒等式和其他一切到加法恒等式,结果是合法Num
实例而不是同态。
type Klein4
= ( Bool
, Bool
)
instance
(
)
=> Num Klein4
where
( a, b ) + ( c, d )
= ( a /= c
, b /= d
)
( a, b ) * ( c, d )
= ( a && b
, b && d
)
negate
= id
fromInteger x
= ( x == 1
, x == 1
)
Run Code Online (Sandbox Code Playgroud)
这对我来说有点令人惊讶。所以我的问题是为什么会这样?意图fromInteger
是环同态而我只是迂腐,还是有一个很好的用例,您可能想以fromInteger
一种不是同态的方式定义它(并且仍然遵循Num
定律)?
就我个人而言,我期望fromInteger
它是一个环同态,并且如果发现一个不具有该属性的实例,我会感到非常惊讶和恼火。
当然,对于每一个好的财产来说,Float
都Double
必须是例外。我只想说,我对此感到非常惊讶和恼火:
> fromInteger (2^64) + fromInteger (-1) == (fromInteger (2^64-1) :: Double)
False
Run Code Online (Sandbox Code Playgroud)
大多数其他提议的Num
属性也被Float
和打破Double
。
我不知道有什么实用类型可以满足所有现行Num
法律,但不fromInteger x + fromInteger y == fromInteger (x+y)
。
归档时间: |
|
查看次数: |
101 次 |
最近记录: |