- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我做了下面的 Num 类实例:
newtype Natural a = Nat a deriving Show
toNatural :: (Integral a) => a -> (Natural a)
toNatural x | x < 0 = error "Negative"
| otherwise = Nat x
fromNatural :: (Integral a) => (Natural a) -> a
fromNatural (Nat i) = i
instance (Integral a) => Num (Natural a) where
x + y = toNatural((fromNatural x) + (fromNatural y))
x - y = let r = fromNatural x - fromNatural y
in if r < 0 then error "Negative"
else toNatural r
x * y = toNatural ((fromNatural x) * (fromNatural y))
abs x = x
signum x | (fromNatural x) == 0 = 0 --by error, I wrote 0 instead of (Nat 0)
| otherwise = 1 --by error, I wrote 1 instead of (Nat 1)
fromInteger = toNatural . fromIntegral
我很惊讶 signum 没有给出类型错误,而且 signum (Nat 5) 给出了 (Nat 1) 而不是 1。我猜想应用了隐式强制转换,但我想知道为什么。请问有人可以解释一下这个问题吗?
最佳答案
0
、5
、24
、(-3)
等整数文字的类型为:
Prelude> :t 0
0 :: Num t => t
整数文字因此可以转换为任何类型,它是 Num
的实例。如果你写 0
,那么你就隐含地写了 fromInteger :: Num a => Integer -> a
在前面。
由于您因此为 Natural a
定义了一个 Num
实例,因此像 0
和 1
这样的整数文字可以也有 Integral a => Natural a
类型。或者如 fromInteger
的文档中所述:
Conversion from an Integer. An integer literal represents the application of the function
fromInteger
to the appropriate value of type Integer, so such literals have type(Num a) => a
.
以类似的方式,您可以使类型成为 Fractional
的实例和浮点字面值代表fromRational :: Fractional a => Rational -> a
的应用, 以及 OverloadedStrings
extension [ghc-doc]你可以使它成为 IsString
的实例对于字符串文字。这些代表了 fromString :: IsString a => String -> a
的应用程序.
关于haskell - 为什么我对 signum 的定义类型正确?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64560396/
我做了下面的 Num 类实例: newtype Natural a = Nat a deriving Show toNatural :: (Integral a) => a -> (Natural a
signum 函数是通常的 mathematical definition of sign 的实现。 ,有条件地返回 {-1,0,1} 中的值。这是一个理论定义,因此,它没有考虑操作的计算成本或值的数
dst = signum(src)函数设置src中所有正元素的值至1 , 并且所有负元素的值为 -1 . 但是,似乎无法实现 signum()通过应用 OpenCV 函数 threshold() .我
我正在使用 Kaffe JVM(相当于 java 1.1)加密数据,并尝试使用 JDK7 解密数据。 在我的算法中,我使用 BigInteger(RSA 加密)。当我在 JDK 中测试应用程序时,一切
我想要一个函数,它对负数返回 -1,对正数返回 +1。 http://en.wikipedia.org/wiki/Sign_function我自己写很容易,但它似乎应该在某个标准库中。 编辑:具体来说
Java 中的 Math.signum(double) 或 Math.signum(float) 是否有等效函数用于其他原始数字,如 int 或长。我不想写这样的代码 int sign = (in
假设我有一个 int x,并且我希望代码根据 x 的符号执行不同的操作。如果我使用 switch 语句,使用 Integer.compare(x, 0) 还是 Math.signum(x) 更好(更快
我是一名优秀的程序员,十分优秀!