gpt4 book ai didi

haskell - 为什么我对 signum 的定义类型正确?

转载 作者:行者123 更新时间:2023-12-03 21:09:53 31 4
gpt4 key购买 nike

我做了下面的 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。我猜想应用了隐式强制转换,但我想知道为什么。请问有人可以解释一下这个问题吗?

最佳答案

0524(-3) 等整数文字的类型为:

Prelude> :t 0
0 :: Num t => t

整数文字因此可以转换为任何类型,它是 Num 的实例。如果你写 0,那么你就隐含地写了 fromInteger :: Num a => Integer -> a在前面。

由于您因此为 Natural a 定义了一个 Num 实例,因此像 01 这样的整数文字可以也有 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/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com