- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我希望能够使用 cata
来自 recursion-schemes
Church 编码列表的包。
type ListC a = forall b. (a -> b -> b) -> b -> b
newtype
,如果您觉得有必要,请使用 GADTs 等。
three :: a -> a -> a -> List1 a
three a b c = \cons nil -> cons a $ cons b $ cons c nil
cons
和
nil
用于代替“普通”构造函数。我相信一切都可以用这种方式编码(
Maybe
、树等)。
List1
确实与普通列表同构:
toList :: List1 a -> [a]
toList f = f (:) []
fromList :: [a] -> List1 a
fromList l = \cons nil -> foldr cons nil l
project
并使用来自
recursion-schemes
的机器.
decons :: [a] -> ListF a [a]
decons [] = Nil
decons (x:xs) = Cons x xs
project
对于普通列表:
decons2 :: [a] -> ListF a [a]
decons2 = foldr f Nil
where f h Nil = Cons h []
f h (Cons hh t) = Cons h $ hh : t
-- decons3 :: ListC a -> ListF a (ListC a)
decons3 ff = ff f Nil
where f h Nil = Cons h $ \cons nil -> nil
f h (Cons hh t) = Cons h $ \cons nil -> cons hh (t cons nil)
cata
具有以下签名:
cata :: Recursive t => (Base t a -> a) -> t -> a
type family instance Base (ListC a) = ListF a
声明列表的基本仿函数类型instance Recursive (List a) where project = ...
最佳答案
newtype
包装器原来是我错过的关键步骤。这是来自 recursion-schemes
的代码以及示例 catamorphism .
{-# LANGUAGE LambdaCase, Rank2Types, TypeFamilies #-}
import Data.Functor.Foldable
newtype ListC a = ListC { foldListC :: forall b. (a -> b -> b) -> b -> b }
type instance Base (ListC a) = ListF a
cons :: a -> ListC a -> ListC a
cons x (ListC xs) = ListC $ \cons' nil' -> x `cons'` xs cons' nil'
nil :: ListC a
nil = ListC $ \cons' nil' -> nil'
toList :: ListC a -> [a]
toList f = foldListC f (:) []
fromList :: [a] -> ListC a
fromList l = foldr cons nil l
instance Recursive (ListC a) where
project xs = foldListC xs f Nil
where f x Nil = Cons x nil
f x (Cons tx xs) = Cons x $ tx `cons` xs
len = cata $ \case Nil -> 0
Cons _ l -> l + 1
关于haskell - Church-encoded 列表的 Catamorphisms,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31464976/
我已经为 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
我是一名优秀的程序员,十分优秀!