- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
a -> a squ-6ren">
如果我用 ghc -Wall
编译以下源文件:
main = putStr . show $ squareOfSum 5
squareOfSum :: Integral a => a -> a
squareOfSum n = (^2) $ sum [1..n]
我得到:
powerTypes.hs:4:18: warning: [-Wtype-defaults]
• Defaulting the following constraints to type ‘Integer’
(Integral b0) arising from a use of ‘^’ at powerTypes.hs:4:18-19
(Num b0) arising from the literal ‘2’ at powerTypes.hs:4:19
• In the expression: (^ 2)
In the expression: (^ 2) $ sum [1 .. n]
In an equation for ‘squareOfSum’:
squareOfSum n = (^ 2) $ sum [1 .. n]
|
4 | squareOfSum n = (^2) $ sum [1..n]
| ^^
我理解 (^) 的类型是:
Prelude> :t (^)
(^) :: (Integral b, Num a) => a -> b -> a
这意味着它适用于任何 a^b
,前提是 a
是一个 Num
而 b
是一个 积分
。我也理解类型层次结构是:
Num --> Integral --> Int or Integer
其中 -->
表示“包含”,前两个是类型类,后两个是类型。
为什么 ghc
没有最终推断出 2
是一个 Int
,而不是“将约束默认为 Integer”。为什么 ghc
默认值是什么?将 2
替换为 2::Int
是解决此警告的好方法吗?
最佳答案
在 Haskell 中,数字文字具有多态类型
2 :: Num a => a
这意味着表达式 2
可用于生成任何数字类型的值。例如,所有这些表达式类型检查:
2 :: Int
2 :: Integer
2 :: Float
2 :: Double
2 :: MyCustomTypeForWhichIDefinedANumInstance
从技术上讲,每次我们使用 2
时,我们都必须编写 2::T
来选择我们想要的实际数字类型 T
。幸运的是,这通常是不需要的,因为类型推断可以经常从上下文中推断出 T
。例如,
foo :: Int -> Int
foo x = x + 2
这里,x
是 Int
因为类型注释,而 +
要求两个操作数具有相同的类型,因此 Haskell 推断2::整数
。从技术上讲,这是因为 (+)
有类型
(+) :: Num a => a -> a -> a
然而,有时类型推断无法从上下文中推断出T
。考虑这个涉及自定义类型类的示例:
class C a where bar :: a -> String
instance C Int where bar x = "Int: " ++ show x
instance C Integer where bar x = "Integer: " ++ show x
test :: String
test = bar 2
test
的值是多少?好吧,如果 2
是一个 Int
,那么我们有 test = "Int: 2"
。如果它是一个 Integer
,那么我们有 test = "Integer: 2"
。如果是另一种数值类型T
,我们找不到C T
的实例。
此代码本质上是不明确的。在这种情况下,Haskell 强制将无法推导的数字类型默认为Integer
(程序员可以将此默认值更改为另一种类型,但现在不相关) .因此我们有 test = "Integer: 2"
。
虽然这种机制会检查我们的代码类型,但它可能会导致意想不到的结果:据我们所知,程序员可能想要 2::Int
。因此,GHC 选择默认值,但会发出警告。
在您的代码中,(^)
可以使用指数的任何 Integral
类型。但是,原则上,x ^ (2::Int)
和 x ^ (2::Integer)
可能会导致不同的结果。我们知道情况并非如此,因为我们知道 (^)
的语义,但对于编译器而言,(^)
只是具有该类型的随机函数,它可以表现Int
和 Integer
不同。考虑一下,例如,
a ^ n = if n + 3000000000 < 0 then 0 else 1
当 n = 2
时,如果我们使用 n::Int
,则 if
守卫在 32 位系统上可能为真。使用永不溢出的 n::Integer
时情况并非如此。
在这些情况下,标准解决方案是使用类似 x ^ (2::Int)
的方式解决警告。
关于haskell - 为什么 ghc 警告 ^2 需要 "defaulting the constraint to type ' Integer'?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70169536/
runghc 和 ghc 有什么区别? 我运行了一个简短的程序,似乎可以用两者编译,除了我用 runghc 得到了以下内容,但不是普通的 ghc: error: Variable not in sco
如果 friend 想要运行我的 Haskell 二进制文件,他是否必须先安装 Haskell,还是可以立即自行运行二进制文件? Mac、Windows 和 Linux 上的答案相同吗? 最佳答案 G
ffunction glMultiDrawElements 需要一个指向指针的指针作为其参数之一。如何从 StorableArray Int a 获取 Ptr(Ptr a) ? 最佳答案 您需要先将索
module Has (r,p,s) where import Prelude ((==),Bool(..),otherwise,(||),Eq) import qualified Data.List
我已经构建了 ghc-HEAD,我想尝试构建所有的 stackage lts 或 nightly 看看它能做多少。 无论我说什么都无法说服 stack 使用我的新 ghc 构建任何东西。我尝试设置如下
我正在使用 Emacs (24.3.1) 在 haskell-mode 中与 ghc-mod 一起使用 Haskell。 现在除了一件烦人的事情外,一切都很好: GHC 信息缓冲区中的每个输出仅包含第
为什么升级到 OSX Mavericks 后我的 GHC 7.6.3 不能工作? 最佳答案 花了很长时间才弄清楚如何同时使用 OSX 10.9 和 GHC 7.6.3,这里有一些技巧可以帮助您重新构建
我有一个带有 cabal 文件的主要 Haskell 可执行程序。在那里,我指定 ghc-options . 这个可执行文件链接到野外的其他库。请问ghc-options忽略这些库的 cabal 文件
我有一个使用 -Wall 编译的库,并且我有一个使用 -Wall -Wno-incomplete-patterns 的测试套件 当我使用 stack ghci --test 启动 ghci 时,ghc
我正在尝试使用以下脚本在 Windows 上安装 GHC(并将 ghc 放在路径中),但是当我尝试运行 ghci --version 时它失败了。我认为脚本有问题。 install: - ps:
我在 $HOME 中安装了 ghc-7.2.2 unknown linux tar.bz2在archlinux上。 在使用 cabal-dev 成功安装多个软件包后,尝试安装例如。我得到的解析数字、文
想法 我正在写 DSL ,编译为 Haskell。 该语言的用户可以定义自己的不可变数据结构和相关函数。关联函数是指属于数据结构的函数。 例如,用户可以编写(在“pythonic”伪代码中): dat
(我的问题是在没有 haskell-platform、ghc、cabal 等的情况下分发二进制文件) 我需要部署一个结构良好的 haskell 应用程序(Yesod 脚手架),但我有磁盘空间限制。 G
我试图将 Cygwin 安装程序指向 http://haskell.org/ghc/cygwin ,但安装程序无法找到 setup.ini.sig。如果可能的话,我该如何编辑我的 .bashrc 以引
我有一个现有的 Haskell 函数,它使用 GHC API 从模块中动态加载已编译的代码。它基于博客文章中的代码 Dynamic Compilation and Loading of Modules
我使用:Ubuntu 上的 GHC 7.6.3(通过 apt-get install haskell-platform) 从当前存储库安装它。 正在尝试安装ghc-mod ,因为我的 ide 插件需要
AFAIK,有两种方法可以在 Haskell 中获取用于调试的调用堆栈: 添加 HasCallStack代码中的约束 使用 ghc -prof -fprof-auto-top 编译代码 我的测试代码:
我想用 64 位 GHC 构建 32 位 DLL。这是最小的例子。 测试.hs {-# LANGUAGE ForeignFunctionInterface #-} module Test where
ghc-gc-tune 0.2.1 可以与 ghc 7.4.1 一起使用吗?看来 ghc-gc-tune 已经有一段时间没有更新了,可能只适用于 ghc 6.x?我找不到任何可靠的信息。 我收到以下错
语言扩展 ExplicitForall 使得使用 forall 绑定(bind)类型变量成为可能但不是必需的。 例如,下面的程序可以编译 {-# LANGUAGE ExplicitForAll #-}
我是一名优秀的程序员,十分优秀!