问题标签 [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 - 为什么将 sq 改为 point-free 会改变类型
可能重复:
这个 ghci 会话中的类型是怎么回事?
为了尝试练习一些haskell并了解无点,我正在玩一个对数字求平方的函数
所以我开始定义
所以我可以用 dup 重写 sq (现在不用担心让 dup 点免费)
并检查 sq 的类型,我看到了我期望看到的
所以我删除了x并得到
我错过了什么?
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]
haskell - Haskell 乘以 Int 和实数
我有
和
我想做
我需要做哪些类型签名和转换功能才能完成这项工作?如果我想有能力将 val 推广到任何类型的 Num,我必须做什么?
这个:
给我这个编译器警告:
我知道那不是我最初问的,我在清理代码时犯了一些错误。
现在有一个系数类型:
产生的错误:
haskell - 根据类型的具体性重构惰性列表?
我在 Haskell 中编写了一个简单(且不严重)的素数生成器,具有用于生成素数和确定数字的素数的相互递归定义:
我注意到它似乎在每次引用时都重建了已经生成的素数的子列表primes
:
但是当我将类型注释更改为使用具体的整数类型时,例如
每个素数只生成一次:
对我来说似乎很好奇。发生这种情况有什么特别的原因吗?
haskell - Haskell 中的无点函数
如何定义这个无点?
按预期工作。最合乎逻辑的似乎只是放弃m
这样的:
可以在 ghci 中定义,但是用它来调用它argmax [1,3,4,5,6,1]
给了我
我认为这与类型有关:
对于点版本:
对于无积分版本:
这是 ghci 诡异还是我做错了什么?
haskell - :冲刺多态值?
我想知道为什么在这种情况下:sprint
报告:xs = _
但在这种情况下不是:
注意:我正在ghci
运行-XNoMonomorphismRestriction
. 这是否与xs
第一种情况下的类型是多态的但在第二种情况下无关的事实有关?我想知道内部发生了什么。
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”的类型有什么区别?
非常感谢您的任何建议
haskell - Haskell 中的换能器和单态性限制
我在 Haskell 中实现了如下的转换器:
现在我想定义一个通用map
函数。因此,我将上述代码加载到 GHCi 中:
所以我无法定义map = reduce . mapping
。但是,我可以定义map f = reduce (mapping f)
.
我相信这个问题是由单态限制引起的。我真的很想写map = reduce . mapping
而不是map f = reduce (mapping f)
。因此,我有两个问题:
- 是什么导致了这个问题?确实是单态限制吗?
- 我该如何解决这个问题?
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 新手)更了解这里到底发生了什么,以及为什么会出现这些问题。
function - 为什么 Haskell 无点函数版本会导致模棱两可的类型错误?
事实证明,在 GHC 7.10 中,这编译得很好:
但是这个:
导致以下错误:
为什么会发生这种情况,通过理解这种差异可以获得什么洞察力?另外,我可以给这个函数一个类型(仍然是通用的)以使这个错误消失吗?