关于'Num'的算术运算的规则

She*_*rsh 0 polymorphism haskell constants

常量在Haskell中是多态的.所以当我写:

foo = 5
Run Code Online (Sandbox Code Playgroud)

这个去掉了:

foo = fromInteger 5
Run Code Online (Sandbox Code Playgroud)

但是如果添加算术表达式呢?

foo = 42 - 15
Run Code Online (Sandbox Code Playgroud)

究竟是什么会被贬低?

foo = fromInteger (42 - 15)
Run Code Online (Sandbox Code Playgroud)

要么

for = fromInteger 42 - fromInteger 15
Run Code Online (Sandbox Code Playgroud)

另外,观察这个最简单可靠的方法是什么?

Pro*_*bie 5

Haskell具有多态文字.(默认只是数字,但GHC具有多态字符串文字和多态列表文字的语言扩展)

强制表达式(如fromInteger)仅对文字本身进行操作,而不是对表达式进行操作

foo = 42 - 15
Run Code Online (Sandbox Code Playgroud)

foo = fromInteger 42 - fromInteger 15
Run Code Online (Sandbox Code Playgroud)

是等价的.

我们可以通过定义Num行为不同的实例(例如,在哪里+-交换)来证明这种情况.

newtype Inverted a = Inverted {unInvert :: a}
  deriving (Eq, Ord, Show)

instance (Num a) => Num (Inverted a) where
  (Inverted x) + (Inverted y) = Inverted (x-y)
  (Inverted x) - (Inverted y) = Inverted (x+y)
  signum = Inverted . signum . unInvert
  (Inverted x) * (Inverted y) = Inverted (x*y)
  abs = Inverted . abs . unInvert
  fromInteger = Inverted . fromInteger

base :: Inverted Double
base = 42 - 15

fromBeforeOp :: Inverted Double
fromBeforeOp = fromInteger 42 - fromInteger 15

fromAfterOp :: Inverted Double
fromAfterOp = fromInteger (42 - 15)
Run Code Online (Sandbox Code Playgroud)

两者basefromBeforeOp给出相同的(正确的定义Inverted)答案57,同时fromAfterOp给出27.