我最近学习了一些关于F-代数的知识:https://www.fpcomplete.com/user/bartosz/understanding-algebras。我想将这种功能扩展到更高级的类型(索引和高阶)。此外,我查看了“使Haskell晋升”(http://research.micros...
我有这个抽象语法树data ExprF r = Const Int | Add r r type Expr = Fix ExprF 我想要比较x = Fix $ Add (Fix (Const 1)) (Fix (Const 1)) y = Fix $ Add (Fix (Const 1)...
我“发明”了一种递归方案,它是折叠映射的一般化。使用折叠映射对数据结构进行折叠时,您无法访问子术语,只能访问折叠的子结果:{-# LANGUAGE DeriveFunctor #-} import qualified Data.Map as M newtype Fix f = Fix { u...
Scalaz提供了一个名为fold的方法,用于各种ADT,例如Boolean,Option[_],Validation[_, _],Either[_, _]等。该方法基本上需要使用与给定ADT的所有可能情况对应的函数。换句话说,就是下面所示的模式匹配:x match { case Case...
使用以下针对自然数的折叠函数,我可以实现各种算术算法,而无需处理递归: cataNat :: b -> (b -> b) -> Natural -> b cataNat zero succ = go where go n = if (n <= 0) ...
我有一个递归数据类型,它具有Functor实例: 我有一个递归数据类型,它具有Functor实例:data Expr1 a = Val1 a | Add1 (Expr1 a) (Expr1 a) deriving (Eq, Show, Functor) 现在,我有兴趣修改这种数据类...
我正在努力理解“anamorphism”的概念。 在函数式编程中,anamorphism是对列表展开概念的一般化。形式上,anamorphisms是通用函数,可以递归地构造某种类型的结果,并且由决定构造下一个单步的函数参数化。 它的对偶,catamorphism,在这篇文章中得到了很好的描...
我有一个简单的 Expr AST,我可以轻松地将它转换为 String。 import Prelude hiding (Foldable) import qualified Prelude import Data.Foldable as F import Data.Functor.Folda...
这个问题的答案表明,在Scala中,Option的fold方法是一个catamorphism。从维基百科上可以看到,catamorphism是“从初始代数到其他代数的唯一同态。该概念已应用于函数式编程中的折叠”。所以这似乎是合理的,但我需要了解F-代数类别中的初始代数作为初始对象。 因此,...
我最近阅读了有关递归方案的内容,其中将折叠函数描述为类似于广义的foldr。 在所有情况下,是否可以通过cata编写Foldable实例(通过foldr或foldMap)?