recursion-schemes相关内容
我正试图从blog on recursion schemes中理解组织同构。我在运行博客中提到的解决change making problem的例子时遇到了一个问题。 找零问题取一种货币的面额,并试图找到创造一笔给定货币所需的最小硬币数量。下面的代码摘自博客,应该可以计算出答案。 {-# LANGUAGE DeriveFunctor #-} module Main where impo
..
我在函数式编程和 PLT 圈子中多次听说过“代数"这个词,尤其是在讨论对象、共子、透镜等时.谷歌搜索这个术语给出了对这些结构进行数学描述的页面,这对我来说几乎是不可理解的.谁能解释一下余代数在编程上下文中的含义,它们的意义是什么,以及它们与对象和共子的关系? 解决方案 代数 我认为首先要了解代数的概念.这只是对群、环、幺半群等代数结构的概括.大多数时候,这些东西都是以集合的形式介绍的
..
我正在尝试了解 catamorphisms 并且我已经阅读了维基百科文章和F#主题系列中的前几篇文章F# 内部 博客. 我理解这是折叠的概括(即,将多个值的结构映射到一个值,包括将值列表映射到另一个列表).我认为折叠列表和折叠树是一个典型的例子. 是否可以使用 LINQ 的 Aggregate 运算符或其他一些更高阶的方法在 C# 中完成此操作? 解决方案 LINQ 的 Agg
..
我有这个简单的 Expr AST,我可以轻松地将它转换为 String. import Prelude 隐藏(可折叠)进口合格前奏将 Data.Foldable 导入为 F导入 Data.Functor.Foldable导入 Data.Monoid导入 Control.Comonad.Cofree数据 ExprF r = Const Int|添加 r派生 ( Show, Eq, Ord, Fun
..
是否有一个递归方案的名称,就像一个变态法,但是它允许在仍运行时查看最终结果?这是一个精心设计的示例: toPercents ::浮动==>[a]->[一种]toPercents xs =结果在哪里(总计,结果)=文件夹go(0,[])xs去x〜(t,r)=(x + t,100 * x/total:r){->>>toPercents [1,2,3][16.666666666666668,33.3
..
如果我有一个值 a:Free [Op,A] ,是否可以“展平" a 的结构,以便两个 Op 可能会折叠成一个吗? 上下文:我想在解释之前将其作为优化步骤执行,因为 Op 的语义是其运算是幂等的.因此,如果两个“连续"出现,则可以在不增加程序语义的情况下消除第二个. 解决方案 据我所知,Free Monad程序无法进行这种自省,因为它表示顺序计算,其中每一步都取决于另一步的结果.
..
我对以更高阶的方式(递归方案)编写递归代码感兴趣,其中递归调用之间可能存在依赖关系. 作为一个简化的示例,考虑一个遍历整数树的函数,检查和是否小于某个值.我们可以对整个树求和并将其与最大值进行比较.另外,一旦超过最大值,我们就可以保持连续和短路: 数据树=叶子Nat |节点树sumLT :: Nat->树->布尔sumLT max t = sumLT'max t>0sumLT':: Nat
..
我目前正在从结构递归/同构性的意义上学习褶皱.我对自然数使用折线来实现幂和阶乘.请注意,我几乎不了解Haskell,因此代码可能很尴尬: foldNat zero succ = go where go n = if (n
..
在Ed Kmett的recursion-scheme包中,有三个声明: newtype Fix f = Fix (f (Fix f)) newtype Mu f = Mu (forall a. (f a -> a) -> a) data Nu f where Nu :: (a -> f a) -> a -> Nu f 这三种数据类型有什么区别? 解决方案 Mu表示递归类
..
我想生成一个按字典顺序排列的数字序列,以使每个数字的总和是一个给定的常数.它有点类似于“子集和问题".例如,如果我想生成sum = 3的4位数字,那么我有一个像这样的序列: [3 0 0 0] [2 1 0 0] [2 0 1 0] [2 0 0 1] [1 2 0 0] ...依此类推. 我能够使用以下代码在Python中成功完成此操作: import
..
我们有一个AST定义: data term a = Lam String a |应用程序a | Var String deriving(Read,Show,Eq,Functor,Foldable,Traversable) 并且用于类型推断的F代数: type Wrapped ma = Enviroment-> m a 类型结果m =包装(类型,替
..
我使用了recursion-schemes黑客库中的变形来实现了损坏的filter函数: import Data.Functor.Foldable xfilter :: (a -> Bool) -> [a] -> [a] xfilter f = ana $ project . phi f phi :: (a -> Bool) -> [a] -> [a] phi f (h : t) | n
..
不用说,Haskell的标准构造 newtype修复f =修复{getFix :: f(修复f) } cata ::(Functor f)=> (f a - > a) - >修复f - > cata f = f。 fmap(cata f)。 getFix 非常棒,非常有用。 试图在Agda中定义一个类似的东西(我只是为了完整起见) da
..
许多catamorphisms似乎很简单,主要用自定义函数替换每个数据构造函数,例如 data Bool = False | True foldBool :: r - 假构造函数 - > r - 真正的构造函数 - >布尔 - > r data也许a = Nothing |只需 foldMaybe :: b - 无构造函数 - > (a - > b) -
..
我已经按照Bartosz Milewski的文章( F-Algebra rel =“noreferrer”>一个,两个): / em> 模块代数其中 数据Expr a =分支[a] | Leaf Int 实例Functor Expr其中 fmap f(分支xs)=分支(fmap f xs) fmap _(Leaf i)= Leaf i newtype修复a =修复{un
..
我有这个简单的 Expr AST,我可以很容易地将它转换为 String 。 导入Prelude隐藏(可折叠) 导入限定前奏 导入Data.Foldable为F 导入Data.Functor。可折叠 导入Data.Monoid 导入Control.Comonad.Cofree 数据ExprF r = Const Int |添加rr deriving(Show,Eq,Ord,
..
我正在寻找一些非常简单,易于理解的递归方案和核心引力方案(变形,变形,变形等)的解释,它们不需要大量的链接或打开类别理论教科书。我确信我已经在无意识中重塑了这些方案中的许多,并且在编码过程中将它们“应用”在我的头脑中(我相信我们中的很多人都有),但我不知道(共)递归方案I使用被称为。 (好的,我说谎了,我刚刚读到了其中的一些,这引发了这个问题,但在今天之前,我没有任何线索。) 我认为这些概念
..