问题标签 [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.

0 投票
1 回答
298 浏览

haskell - 为什么将 sq 改为 point-free 会改变类型

可能重复:
这个 ghci 会话中的类型是怎么回事?

为了尝试练习一些haskell并了解无点,我正在玩一个对数字求平方的函数

所以我开始定义

所以我可以用 dup 重写 sq (现在不用担心让 dup 点免费)

并检查 sq 的类型,我看到了我期望看到的

所以我删除了x并得到

我错过了什么?

0 投票
1 回答
728 浏览

haskell - 请给我解释一下单态性限制?

我开始做 99 个 haskell 问题,我在第7 个问题上,我的单​​元测试被炸毁了。

显然,这是由于:http ://www.haskell.org/haskellwiki/Monomorphism_restriction

我只是想确保我理解正确,因为我有点困惑。

情况 1:funca被定义为没有类型 def 或非严格类型 def 然后使用一次,编译器在编译时推断类型没有问题。

情况2:程序中多次使用同一个函数a,编译器不能100%确定类型是什么,除非它为给定的参数重新计算函数。

为了避免计算损失,ghc 向程序员抱怨它需要严格的类型 def ona 才能正常工作。

我认为在我的情况下,assertEqual具有 def 类型

我在定义时遇到错误test3,我将其解释为它有 2 种可能的类型用于返回testcase3(Show 和 Eq) 并且不知道如何继续。

这听起来正确还是我完全关闭了?

问题7.hs:

第一种情况:testcase3 = flatten (List [])

第二种情况:testcase3 = flatten (List []) :: Eq a => [a]

0 投票
1 回答
3538 浏览

haskell - Haskell 乘以 Int 和实数

我有

我想做

我需要做哪些类型签名和转换功能才能完成这项工作?如果我想有能力将 val 推广到任何类型的 Num,我必须做什么?

这个:

给我这个编译器警告:

我知道那不是我最初问的,我在清理代码时犯了一些错误。

现在有一个系数类型:

产生的错误:

0 投票
1 回答
107 浏览

haskell - 根据类型的具体性重构惰性列表?

我在 Haskell 中编写了一个简单(且不严重)的素数生成器,具有用于生成素数和确定数字的素数的相互递归定义:

我注意到它似乎在每次引用时都重建了已经生成的素数的子列表primes

但是当我将类型注释更改为使用具体的整数类型时,例如

每个素数只生成一次:

对我来说似乎很好奇。发生这种情况有什么特别的原因吗?

0 投票
0 回答
123 浏览

haskell - Haskell 中的无点函数

如何定义这个无点?

按预期工作。最合乎逻辑的似乎只是放弃m这样的:

可以在 ghci 中定义,但是用它来调用它argmax [1,3,4,5,6,1]给了我

我认为这与类型有关:

对于点版本:

对于无积分版本:

这是 ghci 诡异还是我做错了什么?

0 投票
1 回答
527 浏览

haskell - :冲刺多态值?

我想知道为什么在这种情况下:sprint报告:xs = _

但在这种情况下不是:

注意:我正在ghci运行-XNoMonomorphismRestriction. 这是否与xs第一种情况下的类型是多态的但在第二种情况下无关的事实有关?我想知道内部发生了什么。

0 投票
1 回答
121 浏览

haskell - 奇怪的函数类型

我对 Haskell 中的类型有一个初学者的问题:具有如下功能:

如何在f0 xs = f 0 xs不显式使用 xs 的情况下定义函数?刚拿

不工作...

ghci 向我展示了以下类型:
f :: Ord a => Int -> [a] -> a
f0 :: [()] -> ()
但是 ":tf 0" 给出了f 0 :: Ord a => [a] -> a.

这是为什么?为什么我会为 f0 获得这种类型?为什么“f0”的类型和“f 0”的类型有什么区别?

非常感谢您的任何建议

0 投票
1 回答
323 浏览

haskell - Haskell 中的换能器和单态性限制

我在 Haskell 中实现了如下的转换器:

现在我想定义一个通用map函数。因此,我将上述代码加载到 GHCi 中:

所以我无法定义map = reduce . mapping。但是,我可以定义map f = reduce (mapping f).

我相信这个问题是由单态限制引起的。我真的很想写map = reduce . mapping而不是map f = reduce (mapping f)。因此,我有两个问题:

  1. 是什么导致了这个问题?确实是单态限制吗?
  2. 我该如何解决这个问题?
0 投票
1 回答
155 浏览

haskell - 当单态限制*打开*时,如何解决歧义问题?

因此,在学习 Haskell 时,我很快就遇到了可怕的单态限制(在 ghci 中):

所以有很多关于这个的材料,例如here,而且解决起来并不难。我可以为 f 添加显式类型签名,也可以关闭单态限制(直接在 ghci 或 .ghci 文件中使用 ":set -XNoMonomorphismRestriction")。

有一些关于单态限制的讨论,但似乎一般建议是可以关闭它(我被告知在较新版本的 ghci 中默认情况下它实际上是关闭的)。

所以我把它关掉了。

但后来我遇到了另一个问题:

这实际上是从“Real World Haskell”书中的示例代码简化而来的,这对我不起作用,你可以在这个页面上找到它:http: //book.realworldhaskell.org/read/monads.html(它是Monads 章节和 getRandom 示例函数,在该页面上搜索“getRandom”)。

如果我保留单态限制或打开它),那么代码就可以工作。如果我将其更改为:它也可以(具有单态限制):

或者如果我之前指定了“a”的类型:

但是,对于第二种解决方法,我必须打开“范围类型变量”扩展(使用“:set -XScopedTypeVariables”)。

问题在于,在这种情况下(单态限制时出现问题,这两种解决方法似乎都不是普遍适用的。

例如,也许我想编写一个函数来做这样的事情并与任意(或多个)类型一起工作,当然在这种情况下,我很可能确实想要保持新的生成器状态(在“g”中) .

那么问题是:我如何解决这种问题,一般来说,而不直接指定确切的类型?

而且,最好(作为 Haskell 新手)更了解这里到底发生了什么,以及为什么会出现这些问题。

0 投票
1 回答
805 浏览

function - 为什么 Haskell 无点函数版本会导致模棱两可的类型错误?

事实证明,在 GHC 7.10 中,这编译得很好:

但是这个:

导致以下错误:

为什么会发生这种情况,通过理解这种差异可以获得什么洞察力?另外,我可以给这个函数一个类型(仍然是通用的)以使这个错误消失吗?