fromInteger 应该是环同态吗?

Sri*_*aic 9 haskell algebra

直到今天我的假设是fromIntegerNum班是一个环同态。我假设这是因为 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定律)?

Dan*_*ner 4

就我个人而言,我期望fromInteger它是一个环同态,并且如果发现一个不具有该属性的实例,我会感到非常惊讶和恼火。

当然,对于每一个好的财产来说,FloatDouble必须是例外。我只想说,我对此感到非常惊讶和恼火:

> 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)