问题标签 [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 回答
110 浏览

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!

0 投票
1 回答
6859 浏览

haskell - 什么是单态限制?

我对 haskell 编译器有时如何推断出多态性低于我预期的类型感到困惑,例如在使用无点定义时。

似乎问题在于“单态限制”,默认情况下在旧版本的编译器上启用。

考虑以下 haskell 程序:

如果我用它编译它,ghc我不会得到任何错误,并且可执行文件的输出是:

如果我将main身体更改为:

我没有编译时错误,输出变为:

正如预期的那样。但是,如果我尝试将其更改为:

我收到一个类型错误:

尝试sort使用不同类型调用两次时也会发生同样的情况:

产生以下错误:

  • 为什么ghc突然认为这plus不是多态的并且需要Int参数?唯一的参考Int是在应用程序plus,当定义显然是多态的时,这有什么关系?
  • 为什么ghc突然觉得sort需要Num Char实例?

此外,如果我尝试将函数定义放入它们自己的模块中,如下所示:

编译时出现以下错误:

  • 为什么不能ghc使用多态Ord a => [a] -> [a]类型sort
  • 为什么要区别ghc对待?应该有多态类型,我真的不明白这与类型有什么不同,但只会引发错误。plusplus'plusNum a => a -> a -> asortsort

最后一件事:如果我评论sort文件编译的定义。但是,如果我尝试将其加载ghci并检查我得到的类型:

为什么不是plus多态的类型?


这是元问题 中讨论的有关 Haskell 中单态限制的规范问题。

0 投票
1 回答
54 浏览

haskell - ghci 中的混淆类型

这是我的代码:

尝试申请calcBmisn,我收到以下错误:

在 ghci 中的进一步调查:

我假设我生成的列表是 type (Integer,Integer),但不能在 中处理calcBmis,它只接受Fractional. 知道如何解决这个问题吗?

0 投票
1 回答
63 浏览

haskell - 存在量化构造函数列表

我有以下数据类型:

在 GHCI 中,我可以毫无问题地执行以下操作:

let bs = [B, B]

但是,如果我尝试在已编译的文件中执行此操作,则会收到以下错误:

我错过了哪些扩展名,可以让我创建B如图所示的列表?或者我错过了 GHCI 添加的内容?

0 投票
1 回答
104 浏览

haskell - ghci - 默认混淆

minBound在检查不同整数类型的大小( , maxBound)和“十进制表示的长度”时,我碰巧看到了一些奇怪的行为。

使用 GHCi:

在我期望的最后一个地方19

我的第一个猜测是maxBound默认为()因此 yield 2,但我不明白因为ma应该是一个Int显式类型注释 ( :: [Int]) - 并且通过引用透明性,所有命名的符号ma都应该是相等的。

如果我将上面的语句放在一个文件中并将其加载到 GHCi 中,我会得到正确的结果。

那么为什么我会得到错误的结果呢?

0 投票
4 回答
247 浏览

haskell - 如何在应用了类型默认规则的 ghci 中打印多态函数(或值)的类型?

当我:t在 GHCi 中输入命令时,我看到多态类型:

但是在我实际评估这些函数之后,我看到了类型默认规则的结果。是否有一些命令或能力可以在 ghci 中观察在根据 Haskell 报告和/或 ghc 实现应用类型默认规则后如何更改类型?

0 投票
2 回答
234 浏览

haskell - Haskell使用foldr throw类型错误计算长度

尝试通过 foldr 函数实现列表计数

给出以下错误

我该如何解决?

0 投票
1 回答
84 浏览

haskell - “引用”类型类函数

我是一个初学者,我正在尝试使用Hoed来跟踪 Haskell 评估,因为它可能会进一步帮助我的学习过程。

我在他们的示例代码中看到了这样的

我在想如何才能observe跟踪实例定义的函数>>=,例如。

我写了类似的东西

bind' = observe "bind'" (>>=)

当然我有一个错误

我应该/如何使用类型注释来指定哪个Monad实例的(例如 Reader、State 等)>>=函数

0 投票
0 回答
41 浏览

haskell - 是什么使定义受到单态性限制?

为什么这个定义会受到单态限制的影响?

这不是:

0 投票
2 回答
101 浏览

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;我看到的唯一区别是第一个在参数位置,第二个在返回位置。