- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
b) -> (forall c.c -> c) f1 f = id f (和 HLin-6ren">
我发现我可以说
{-# LANGUAGE RankNTypes #-}
f1 :: (forall b.b -> b) -> (forall c.c -> c)
f1 f = id f
f2 :: (forall b.b -> b) -> (forall c.c -> c)
f2 = id
Couldn't match expected type `c -> c'
with actual type `forall b. b -> b'
Expected type: (forall b. b -> b) -> c -> c
Actual type: (forall b. b -> b) -> forall b. b -> b
In the expression: id
In an equation for `f2': f2 = id
id
与建议的等级 2 类型:
f2 :: (forall b.b -> b) -> (forall c.c -> c)
f2 = id :: (forall b.b -> b) -> (forall c.c -> c)
a -> a
,并且它已被限制为
(forall b.b -> b) -> (forall c.c -> c)
。因此,为了证明这种使用的合理性,
(forall b.b -> b)
必须匹配
(forall c.c -> c)
并且是真的)。但上面的例子表明情况并非如此。因此,这是“eta reduce”的真正异常(exception):您必须向双方显式添加参数才能将等级 1 类型的值转换为等级 2 的类型值。
最佳答案
我不确定 HLint 是否知道 RankNTypes
完全没有,也许不是。
事实上 eta 减少通常是不可能的扩展。 GHC 不能只是统一 a->a
和 (forall b.b -> b) -> (forall c.c -> c)
,否则它将完全破坏其对 Rank1-code1 的类型推断能力。 OTOH,统一没问题(forall b.b -> b)
与 a
争论;结果被确认为(forall b.b -> b)
与 (forall c.c -> c)
匹配.
1考虑map id [(+1), (*2)]
.如果 id
被允许具有您正在处理的类型,编译器最终可能会为多态 Num
生成不同的实例选择功能,这当然是不可能的。还是应该?我不确定,考虑一下...
无论如何,我很确定它证明了使用 RankNTypes,完全类型推断是不可能的,所以至少在 Rank1 子集中得到它,GHC 通常必须默认这是一个不太可能的多态选择。
关于haskell - "Eta reduce"是不是一直在 Haskell 中举行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19758828/
问题的标题是我收到的错误的原因是因为我根本不知道如何解释它,无论我做了多少研究。每当我使用 bigglm() (来自 biglm 包,旨在对大量数据运行回归)运行逻辑回归时,我得到: Error in
我正在创建一个 eta 范围在 3 到 20 小时之间的任务,当我查看工作日志时,对于这个任务,工作人员说“从经纪人那里得到任务:...”收到原始任务后每小时,直到达到 eta。 我知道这与设置 BR
我有一个简单的功能: calculate :: Int -> Int -> Int calculate x y = sum . filter even $ enumFromTo x y 可以简化为 c
我正在为一个气象站进行项目,但是我陷入了估计到达时间(ETA)的问题,因此,我还想应用一种方法来估计特定地点的云到达时间,例如,我将有一个太阳能站,然后会有云,但是在它们到达太阳能站之前,我想计算到达
我只从 eta expansion 中找到了一些间接线索 SimpleExpr ::= SimpleExpr1 `_' The expression 𝑒 _ is well-formed if 𝑒
我有一个简单的功能: calculate :: Int -> Int -> Int calculate x y = sum . filter even $ enumFromTo x y 可以简化为 c
在 Debian Squeeze 上,我有一个文件正在从 . 复制到 ./copy。如果我运行 watch du,我可以看到两个目录的大小随时间变化。我如何解析 du 的输出,以便我可以看到文件副本的
我收到 eta 减少以下 lambda 表达式的警告。 \(DataType arg1 arg2) -> DataType (modify arg1) arg2 互联网告诉我减少 eta 的方法是省去
我正在尝试 η-reduce 函数 foldr :: (a -> b -> b) -> b -> BinaryTree a -> b foldr combiner base tree = foldMa
我正在寻找使用线性进度信息计算操作(IE:文件下载)的 ETA 的最佳方法。 假设我有以下方法被调用: void ReportProgress(double position, double tota
更新 1: 下面提供的一些解决方案看起来不错。但是,我只知道循环在其父循环的迭代确定后迭代的次数。所以我不能事先计算所有的迭代。 原问题: 我在一个类似的程序中嵌入了循环: 程序 1: using S
我在玩 van Laarhoven 镜头时遇到了一个问题,即类型检查器拒绝了良好类型函数的 eta 缩减形式: {-# LANGUAGE RankNTypes #-} import Control.A
有人可以帮助我理解这一点/指向我一些阅读 Material 吗?以下工作正常: type F a b = Functor f => f a -> f b fComp :: F b c -> F a b
我正在用 haskell 解决一个非常基本的问题。我试图计算字符串中小写字母的数量。我的解决方案是这样的 import Data.Char lowercaseCount :: String -> In
我想安排一个任务在未来的不同时间运行。我试图在调用任务时使用 eta 选项来执行此操作。这部分本身工作得很好,但同时,我想对任务进行速率限制。我无法同时完成这两件事:安排任务在将来运行,同时也让 ce
下面的代码几乎是不言自明的: class EtaExpansionOnNonMethods { // or object val zero = 0 val zeroEta = zero
我的代码中有这一行 lev_similarity = -1*np.array([[distance.levenshtein(w1,w2) for w1 in words] for w2 in word
当前代码: def chained_task(foo, bar, start_time): return chain(task1.s(foo, bar), task2.s(eta=start_
(here 是我目前工作的要点。) Coq 带有一个关于 eta 减少的规则,允许我们证明如下内容: Variables X Y Z : Type. Variable f : X -> Y -> Z.
Eta-conversion 正在考虑函数 (x) => f(x)与函数 f 相同.在工作中重构代码时,我试图使用这种等效性来简化一些高阶函数调用。然而,事情并没有完全解决,而且我对实际发生的事情有些
我是一名优秀的程序员,十分优秀!