问题标签 [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 type inference for Functors
Lately I've been playing around with Haskell, and specifically the whole functors concept. The more I dive into it, the more a-ha moments I'm getting, and it certainly tickles my dopamine receptors quite a bit.
The problem I'm stuck with is the following. Here's the code that works, it lifts the function and then applies it first to the IO value, and then to a List.
It is very tempting to write it in a more concise manner, i.e.:
Part of me says it's conceptually right, since replicator
should be applyable both to IO and to List instances, but being a strongly typed language Haskell doesn't allow me to do so. I think I pretty much understand why is this happening.
The question is: is there any way I can get any closer to the latter variant? Or is it fine to live with the former?
Thank you!
haskell - 什么是单态限制?
我对 haskell 编译器有时如何推断出多态性低于我预期的类型感到困惑,例如在使用无点定义时。
似乎问题在于“单态限制”,默认情况下在旧版本的编译器上启用。
考虑以下 haskell 程序:
如果我用它编译它,ghc
我不会得到任何错误,并且可执行文件的输出是:
如果我将main
身体更改为:
我没有编译时错误,输出变为:
正如预期的那样。但是,如果我尝试将其更改为:
我收到一个类型错误:
尝试sort
使用不同类型调用两次时也会发生同样的情况:
产生以下错误:
- 为什么
ghc
突然认为这plus
不是多态的并且需要Int
参数?唯一的参考Int
是在应用程序中plus
,当定义显然是多态的时,这有什么关系? - 为什么
ghc
突然觉得sort
需要Num Char
实例?
此外,如果我尝试将函数定义放入它们自己的模块中,如下所示:
编译时出现以下错误:
- 为什么不能
ghc
使用多态Ord a => [a] -> [a]
类型sort
? - 为什么要区别
ghc
对待?应该有多态类型,我真的不明白这与类型有什么不同,但只会引发错误。plus
plus'
plus
Num a => a -> a -> a
sort
sort
最后一件事:如果我评论sort
文件编译的定义。但是,如果我尝试将其加载ghci
并检查我得到的类型:
为什么不是plus
多态的类型?
这是元问题 中讨论的有关 Haskell 中单态限制的规范问题。
haskell - ghci 中的混淆类型
这是我的代码:
尝试申请calcBmis
时n
,我收到以下错误:
在 ghci 中的进一步调查:
我假设我生成的列表是 type (Integer,Integer)
,但不能在 中处理calcBmis
,它只接受Fractional
. 知道如何解决这个问题吗?
haskell - 存在量化构造函数列表
我有以下数据类型:
在 GHCI 中,我可以毫无问题地执行以下操作:
let bs = [B, B]
但是,如果我尝试在已编译的文件中执行此操作,则会收到以下错误:
我错过了哪些扩展名,可以让我创建B
如图所示的列表?或者我错过了 GHCI 添加的内容?
haskell - ghci - 默认混淆
minBound
在检查不同整数类型的大小( , maxBound
)和“十进制表示的长度”时,我碰巧看到了一些奇怪的行为。
使用 GHCi:
在我期望的最后一个地方19
。
我的第一个猜测是maxBound
默认为()
因此 yield 2
,但我不明白因为ma
应该是一个Int
显式类型注释 ( :: [Int]
) - 并且通过引用透明性,所有命名的符号ma
都应该是相等的。
如果我将上面的语句放在一个文件中并将其加载到 GHCi 中,我会得到正确的结果。
那么为什么我会得到错误的结果呢?
haskell - 如何在应用了类型默认规则的 ghci 中打印多态函数(或值)的类型?
当我:t
在 GHCi 中输入命令时,我看到多态类型:
但是在我实际评估这些函数之后,我看到了类型默认规则的结果。是否有一些命令或能力可以在 ghci 中观察在根据 Haskell 报告和/或 ghc 实现应用类型默认规则后如何更改类型?
haskell - Haskell使用foldr throw类型错误计算长度
尝试通过 foldr 函数实现列表计数
给出以下错误
我该如何解决?
haskell - “引用”类型类函数
我是一个初学者,我正在尝试使用Hoed来跟踪 Haskell 评估,因为它可能会进一步帮助我的学习过程。
我在他们的示例代码中看到了这样的
我在想如何才能observe
跟踪实例定义的函数>>=
,例如。
我写了类似的东西
bind' = observe "bind'" (>>=)
当然我有一个错误
我应该/如何使用类型注释来指定哪个Monad
实例的(例如 Reader、State 等)>>=
函数
haskell - 是什么使定义受到单态性限制?
为什么这个定义会受到单态限制的影响?
这不是:
haskell - 将泛型函数类型检查推断为返回类型但不是参数类型
我正在学习 SYB 和 rank n 类型,并遇到了一个令人困惑的情况,似乎是单态限制。
我编写了一个函数来查找与谓词匹配的最浅条目。我想接受一个更像谓词的函数Alternative
,而不是归约函数,并自己将其转换为通用函数。我决定省略let
块中的类型注释,以查看单态减少将如何影响此实现中的类型:
这会产生一个错误,表明let
绑定中的歧义会阻止类型检查器解决约束Data a1
。
(其他机构如根据“无法推断(Typeable a0)因使用'mkQ'而导致head (gmapQ op z)
的绑定歧义”的行导致明确的错误let
;我也没有弄清楚为什么上面的表格没有) .
let
当我们在块中添加注释时,类型错误消失了op :: GenericQ (f a)
(需要 ScopedTypeVariables)。
但是,我很困惑,似乎可以推断出Data
约束:当它是返回类型时,以下类型检查:op
有什么不同?两种情况都op
需要forall d. Data d => d -> f a
;我看到的唯一区别是第一个在参数位置,第二个在返回位置。