- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
下面的 to_c
函数在使用我想用于此处未显示的不相关代码片段的 GADTs 扩展进行编译时由于类型错误而被拒绝。
newtype Church = Church { unC :: forall a. (a -> a) -> a -> a }
to_c :: Int -> Church
to_c 0 = let f0 f c = c in Church f0
to_c n =
let fn f c = iterate f c !! n in Church fn
错误信息:
Couldn't match type ‘a0’ with ‘a’ because type variable ‘a’ would escape its scope
This (rigid, skolem) type variable is bound by
a type expected by the context:
(a -> a) -> a -> a
Expected type: (a -> a) -> a -> a
Actual type: (a0 -> a0) -> a0 -> a0
In the first argument of ‘Church’, namely ‘fn’
我可以用直接递归的方式重写这个函数,它可以进行类型检查,也可以工作;然而,我很好奇为什么这种迭代方法有缺陷,以及是否可以通过一些巧妙的类型注释来挽救它。
最佳答案
这实际上与 GADT 没有任何关系,只是,-XGADTs
扩展还暗示了 -XMonoLocalBinds
,这才是真正的问题所在。它所做的是,因为本地绑定(bind) fn
没有明确的签名,所以它想给它一个不比环境多态的类型......即在这种情况下 根本不是多态的。但当然,它必须是多态的,这样它才能真正用于Church
类型,所以这不好。
您仍然可以提供一个显式多态签名:
{-# LANGUAGE RankNTypes, MonoLocalBinds #-}
newtype Church = Church { unC :: forall a. (a -> a) -> a -> a }
to_c :: Int -> Church
-- to_c 0 = ... -- the base case is redundant.
to_c n =
let fn :: (a -> a) -> a -> a
fn f c = iterate f c !! n
in Church fn
但更简单的解决方案是根本不进行任何绑定(bind),这样-XMonoLocalBinds
就不会起作用:
to_c :: Int -> Church
to_c n = Church (\f c -> iterate f c !! n)
...或者,如果您确实进行了绑定(bind),请在 Church
构造函数中进行,因为那里的环境已经是多态的:
to_c n = Church (let fn f c = iterate f c !! n in fn)
关于haskell - Church 编码转换函数无法使用 GADTs 编译,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48035554/
我已经为 Javascript 中的求和类型的想法苦苦挣扎了很长一段时间。该语言既不包括本地和类型也不包括模式匹配。虽然您可以使用普通的旧 Javascript Object 和原型(prototyp
这有点深奥,但令人抓狂。在对 another question 的回答中,我注意到在这个完全有效的程序中 poo :: String -> a -> a poo _ = id qoo :: (a ->
我找不到将加法定义为重复递增的方法,尽管这在无类型语言中是可能的。这是我的代码: {-# LANGUAGE RankNTypes #-} type Church = forall a . (a ->
我试图在 Haskell 中实现 Church 数字。这是我的代码: -- Church numerals in Haskell. type Numeral a = (a -> a) -> (a ->
我对 lambda 演算中的自然数有如下定义,这是我的主要目标。 -- Apply a function n times on x apply = \f -> \n -> \x -> foldr ($
有人使用过这种编程语言吗 Church ?谁能推荐一下实际应用吗?我刚刚发现它,虽然听起来它解决了人工智能和机器学习中一些长期存在的问题,但我对此表示怀疑。我从来没有听说过它,并且惊讶地发现它实际上已
我一直在阅读的《计算机程序的结构和解释》一书通过定义零和增量函数来介绍 Church 数字 zero: λf. λx. x increment: λf. λx. f ((n f) x) 这对我来说似乎
我希望能够使用 cata来自 recursion-schemes Church 编码列表的包。 type ListC a = forall b. (a -> b -> b) -> b -> b 为方便
下面的 to_c 函数在使用我想用于此处未显示的不相关代码片段的 GADTs 扩展进行编译时由于类型错误而被拒绝。 newtype Church = Church { unC :: forall a.
我看到多次引用 Church Rosser theorem ,特别是钻石属性图,在学习函数式编程时,但我还没有遇到过很好的代码示例。 如果像 Haskell 这样的语言可以被视为一种 lambda 演
作为打发时间,我正在尝试解决我在大学上的一门类(class)(关于 Lambda 微积分和各种编程概念)中提出的各种问题。因此,我正在尝试在 OCaml 中实现 Church 数字和相关运算符(也作为
假设 true (t) 和 false (f) 定义如下: > let t = \x -> \_ -> x t :: t1 -> t -> t1 > let f = \_ -> \y -> y f :
各种优化问题,如this one ,导致了 Church 编码列表作为实现流融合的一种方式,即编译器消除中间结果(例如列表)。以下是在优化问题中成功使用的定义: {-# LANGUAGE RankNT
有没有办法使用 API 从 Google 检索 map ,以便显示带有标记的本地教堂列表? 我有基本的语法,我有一个基本的 API 帐户设置,但我不知道如何/如果我可以使用类型字段。 var mapO
这样的函数怎么写? : unWrap :: F f a -> Either a (f (F f a)) 其中 F - Church 编码的免费 monad.unWrap 如果值等于“Pure a”则返
我一直在使用 Free Control.Monad.Free 中的数据类型来自 free包裹。现在我正在尝试将其转换为使用 F在 Control.Monad.Free.Church但无法弄清楚如何映射
我正在研究 Swift 2.1 中的函数式编程,试图实现 Church encoding pair/cons函数( cons = λx λy λf f x y in untyped lambda ca
一段时间以来,我一直在为 Lambda 微积分苦苦挣扎。有很多资源可以解释如何减少嵌套的 lambda 表达式,但很少能指导我编写自己的 lambda 表达式。 我正在尝试使用纯 lambda 演算(
我必须为 > 、 , != 编者注:我认为这就是 OP 试图提出的问题: 我正在尝试使用 Church 编码在无类型 lambda 演算中实现以下操作: 大于(GT 或 >)。 小于(LT 或 、
我想实现 Church encoding of the pair在 Haskell 的多态 lambda 演算中。 在第 77 页,第 8.3.3 节 Peter Selinger's notes o
我是一名优秀的程序员,十分优秀!