什么是“ Integer”类型的适当值,我可以写一个吗?也是newtypes

问题描述 投票:0回答:1

Haskell 2010报告第6.4.1节说

整数文字表示将函数fromInteger应用到类型Integer的适当值。

“适当的值”是什么样的?我可以在源代码Haskell中编写它吗?我当然可以写

x :: Integer
x = 4

但是那个等式等于

x = (fromInteger 4) :: Integer

编辑:避免无限回归,应该是

x = (fromInteger 4?) :: Integer

其中4?是类型4上的神秘值Integer

因此它选择了IntegerfromInteger重载。文字的类型(在原始x = 4中)仍然是4 :: Num a => a,而不是Integer

我正在考虑此wrtnewtypes:

{-# LANGUAGE  GeneralisedNewtypeDeriving  #-}

newtype Age = MkAge Int  deriving (Num, Eq, Ord, Show)
                        -- fromInteger is in Num
y :: Age
y = 4  
z = (4 + 5 :: Age)      -- no decl for z, inferred :: Age

[如果我询问show y,我会看到MkAge 4;如果我问show x,我会看到普通的4。那么Integer是否有一些不可见的构造函数?

newtype的补充q:因为我可以写z = (4 + 5 :: Age),所以构造函数MkAge真的必要吗?

mkAge2 :: Age -> Age
mkAge2 = id

w = mkAge2 4

mkAge3 :: Integer -> Age
mkAge3 = fromInteger

u = mkAge3 4

如果我想要一些前缀,似乎也可以正常工作。

haskell typeclass newtype
1个回答
0
投票

4 :: Integer是这样的值; 4 :: Int不是。不要将文字4与它在源代码中表示的实际值系列混淆。

4本身具有多态类型Num a => a,这意味着在正确的上下文中,您可以从中“提取”一个类型为4 :: Integer的值。这样的上下文是对fromInteger的调用,因为它希望将Integer类型的值作为参数,而不是Num a => a类型的值。

© www.soinside.com 2019 - 2024. All rights reserved.