问题标签 [monomorphism-restriction]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
haskell - 为什么在 Haskell 中没有推断出多态值?
数值字面量具有多态类型:
但是,如果我将变量绑定到这样的文字,多态性就会丢失:
另一方面,如果我定义一个函数,它当然是多态的:
我可以提供一个类型签名来确保x
保持多态:
但为什么这是必要的?为什么不推断多态类型?
haskell - 使用 uncurry 函数的特定类型推断
我一直在使用uncurry
GHCi 中的函数,但我发现了一些我根本无法理解的东西。当我应用uncurry
该(+)
函数并将其绑定到下面代码中的某个变量时,编译器会推断其类型特定于Integer
:
但是,当询问以下表达式的类型时,我得到(我期望的)正确结果:
什么会导致这种情况?它是 GHCi 特有的吗?
这同样适用于let add' = (+)
。
注意:我无法使用已编译的文件来重现它。
haskell - 将函数转换为无点样式会更改其类型
我开始使用 Haskell... 我尝试以两种不同的方式编写以下微不足道的函数,让 Haskell 决定类型,而类型系统在每种情况下都会做不同的事情。这种行为的解释是什么?
谢谢!
haskell - Haskell 的类型推断异常
查看 ghci 的输出:
为什么look
推断类型与类型不同flip Data.Map.lookup
?
给你一些背景。最初我有一个小程序,并试图弄清楚它为什么会产生编译器错误:
Ghci 的反应:
我发现这个变体编译得很好(类型定义是一样的):
经过一些实验后发现,如果我look
明确输入 type of - 第一个版本也编译得很好:
这引出了我的第一个问题。
haskell - 为什么 3 和 x(分配为 3)在 Haskell 中有不同的推断类型?
Haskell 中的类型推断有一点学习曲线(至少可以这么说!)。开始学习它的一个好方法是使用简单的示例。因此,以下是类型推断的“hello world”。
考虑以下示例:
因此问题是:为什么 3 和 x 有不同的类型?
链接摘要:
阅读下面的答案以获取完整的故事;这里只是一个链接摘要:
- GHC 类型默认:Haskell 报告第 4.3.4 节
- GHCi 的扩展类型默认:使用 GHCi 第 2.4.5 节
- 单态限制:Haskell wiki
haskell - 单态约束对类型类约束的影响
添加类型声明时,此代码会中断baz
:
一个常见的解释(参见Why can't I declare the inferred type? for example)是因为多态递归。
但是这种解释并不能解释为什么效果会随着另一个多态递归示例而消失:
它也没有解释为什么 GHC 认为没有类型声明的递归是单态的。
可以将http://www.haskell.org/onlinereport/decls.html#sect4.5.5中的示例解释reads
应用于我的案例吗?baz
即添加签名消除了单态性限制,并且没有限制,右侧 [] 出现歧义,“固有歧义”类型为forall a . Eq a => [a]
?
haskell - 什么时候可以将函数绑定到另一个名称?
在解释器中工作时,将函数绑定到名称通常很方便,例如:
这将 name 别名为f
function (+1)
。简单的。
但是,这并不总是有效。我发现的一个导致错误的示例是尝试nub
从Data.List
模块中取别名。例如,
但是,如果我明确说明该论点,x
则它可以正常工作:
谁能解释这种行为?
haskell - 使用 state monad 隐藏显式状态
我正在尝试用 Haskell 编写一个小游戏,并且需要传递大量的状态。我想尝试用 State monad 隐藏状态
现在我遇到了一个问题:接受状态和参数的函数很容易在状态单子中工作。但也有一些函数只将状态作为参数(并返回修改后的状态,或者可能是其他东西)。
在我的代码的一部分中,我有这一行:
我希望它不带状态,而是写
目前,它的实现看起来像这样
并且通过这样编写它似乎很简单,使其在 State monad 中工作:
但是,这引起了 ghc 的投诉!它说,没有因使用“get”而产生 (MonadState GameState m0) 的实例。我已经重写了一个非常相似的函数,除了它的 State monad 形式不是无效的,所以我有预感,我像这样重写了它:
果然,它有效!但是我当然得把它叫做getCurrentPlayerM(),我觉得这样做有点傻。传递参数是我首先要避免的!
另一个惊喜:在 ghci 中查看它的类型我得到
但是如果我尝试在我的代码中显式设置它,我会收到另一个错误:“约束 MonadState GameState m 中的非类型变量参数”并提供允许它的语言扩展。我想这是因为我的 GameState 是一种类型而不是类型类,但为什么它在实践中被接受,但当我试图明确说明它时我更困惑。
所以总结一下:
- 为什么我不能在 State monad 中编写空函数?
- 为什么我不能声明我的解决方法函数实际具有的类型?
haskell - NoMonomorphismRestriction 有助于保持共享?
当我偶然发现这种奇怪的行为时,我试图回答另一个关于多态性与共享的问题。
在 GHCi 中,当我显式定义一个多态常量时,它没有得到任何共享,这是可以理解的:
另一方面,如果我尝试通过省略类型签名并禁用单态限制来达到同样的效果,我的常量会突然被共享!
为什么?!
呃......当使用优化编译时,即使禁用了单态限制,它也很快。