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)
另外,观察这个最简单可靠的方法是什么?
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)
两者base并fromBeforeOp给出相同的(正确的定义Inverted)答案57,同时fromAfterOp给出27.