- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我遇到了this construction在 haskell 。我找不到有关如何使用 zap
的任何示例或解释/zapWith
和 bizap
/bizapWith
在实际代码中。它们是否与标准 zip
有某种关联?/zipWith
职能?我如何使用 Zap
/Bizap
Haskell 代码中的仿函数?它们有什么好处?
最佳答案
这篇精彩的 Kmett 博客文章涵盖了这一点,Cofree Comonad and the Expression Problem .不幸的是,那篇博文中有很多术语,我自己也不太了解所有内容,但我们可以尝试勾勒出细节。
皮亚诺号码
让我们以一种非常奇怪的方式定义自然数。我们将首先定义 Peano 零和后继函数:
zero :: ()
zero = ()
incr :: a -> Identity a
incr = Identity
one :: Identity ()
one = incr zero
two :: Identity (Identity ())
two = incr . incr $ zero
three :: Identity (Identity (Identity ()))
three = incr . incr . incr $ zero
3 :: Int
至
three
然后回来。 (试试看。)我们可以写一个函数
f
吗?将任意数字转换为我们奇怪的表示并返回?抱歉不行。 Haskell 类型系统不会让我们构造无限类型,而这正是我们想要的类型
f
.
Identity
很多次。按照这个速度,我将被迫输入 O(n^2) 次来定义 n 个数字。这是 2016 年,我觉得这是 Not Acceptable 。
newtype Free f a = Free (Either a (f (Free f a)))
zero :: a -> Free Identity a
zero x = Free (Left x)
incr :: Free Identity a -> Free Identity a
incr = Free . Right . Identity
one :: a -> Free Identity a
one x = incr (zero x)
two :: a -> Free Identity a
two x = incr (incr (zero x))
three :: a -> Free Identity a
three = incr . incr . incr . zero
Identity
相同- 上面的包装表示。
unfold :: (a -> a) -> a -> (a, (a, (a, ...)))
unfold a2a a = (a, unfold a2a (a2a a))
centurials :: (Int, (Int, (Int, ...)))
centurials = unfold (+ 400) 2000
newtype Cofree f a = Cofree (a, f (Cofree f a))
unfold :: Functor f => (a -> f a) -> a -> Cofree f a
unfold a2fa a = Cofree (a, fmap (unfold a2fa) (a2fa a))
centurials :: Cofree Identity Int
centurials = unfold (Identity . (+ 400)) 2000
f
和
g
在数学意义上是对偶的,那么以下性质成立:
class Zap f g | f -> g, g -> f where
zap :: (a -> b -> r) -> f a -> g b -> r
newtype Identity a = Identity a
)与其自身之间的数学对偶性。
instance Zap Identity Identity where
zap ab2r (Identity a) (Identity b) = ab2r a b
class Bizap f g | f -> g, g -> f where
bizap :: (a -> c -> r) -> (b -> d -> r) -> f a b -> g c d -> r
instance Bizap Either (,) where
bizap ac2r bd2r (Left a) (c, d) = ac2r a c
bizap ac2r bd2r (Right b) (c, d) = bd2r b d
instance Bizap (,) Either where
bizap ac2r bd2r (a, b) (Left c) = ac2r a c
bizap ac2r bd2r (a, b) (Right d) = bd2r b d
instance Zap f g => Zap (Cofree f) (Free g) where
zap ab2r (Cofree as) (Free bs) = bizap ab2r (zap (zap ab2r)) as bs
instance Zap f g => Zap (Free f) (Cofree g) where
zap ab2r (Free as) (Cofree bs) = bizap ab2r (zap (zap ab2r)) as bs
zap
来自
f
的对偶性和
g
,在我们的例子中总是
Identity
和
Identity
为了“剥离”一层
Free
和
Cofree
并递归调用
zap
在那个下层。
year2800 :: Int
year2800 = zap id (two id) centurials
Zip
:
class Functor f => Zip f where
fzipWith :: (a -> b -> c) -> f a -> f b -> f c
关于haskell - Haskell 中 Zap Functor 和 zap 函数的目的是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37198681/
我想在不创建仿函数类的情况下使用仿函数,但即使我将匹配的字符串存储在 foundVector 中,我的 foundVector 仍显示为空。 也告诉我有没有更好的方法来使用fucntors 我正在使用
在阅读类型类时,我发现 Functor、Applicative Functor 和 Monad 之间的关系是严格递增的权力。仿函数是可以映射的类型。 Applicative Functors 可以做同
我对在 Java 中使用仿函数(函数对象)很感兴趣。通过快速谷歌搜索,我找到了这 3 个包: Java 泛型算法:http://jga.sourceforge.net/ 公共(public)仿函数:h
我是 Haskell 的新手。我做了一个类型 Maybe3。 data Maybe3 a= Just3 a| Unknown3 | Missing3 deriving (Show, Eq, Ord)
在研究了基于 MacLane、Awodey 和 Spivak 书籍的类别理论之后,我试图理解 Haskell 中的自由/操作单子(monad)。 我们可以使用 Control.Monad.Free 从
我正在努力深入了解 Monad类的层次结构。当然,其中一部分是看到很多例子,但我对这些类是如何首次发现的历史及其动机特别感兴趣。 我了解 Monad s 最初是作为 Haskell 中 IO 问题的解
我有一个多项式 data Poly a = Poly [a] 我希望能够做类似 fmap (take 3) polynomial 的事情但我不能,因为 Poly不是真正的仿函数,因为 f我在 fmap
我想知道到什么程度Functor Haskell 中的实例由仿函数定律(唯一地)确定。 由于ghc可以推导出Functor对于至少“普通”数据类型的实例,似乎它们至少在各种情况下必须是唯一的。 为方便
我想知道到什么程度Functor Haskell 中的实例由仿函数定律(唯一)确定。 自 ghc可以得出Functor至少对于“普通”数据类型的实例,它们似乎至少在各种情况下必须是唯一的。 为方便起见
有这种类型: {-# LANGUAGE GADTs #-} data Rgb a = (Num a, Show a) => Rgb a a a 我完全能够实现 Show 类型类: instance S
背景。在我的一个类中,我们一直在探索Parser monad。 Parser monad 通常定义为 newtype Parser a = Parser (String -> [(a, String)
我正在尝试使用 length streaming-bytestring Data.ByteString.Streaming.Char8 库的函数。 我看到返回值的类型为Of,但我不清楚如何检查它。我尝
我正在尝试编写一个多态的 map (Functor) 但我遇到了这种类型的错误。 给定以下类型 type Result = | Success of 'TSuccess | Error
我一直在努力理解 Haskell 中的 Functor 是什么,为此我想要一个没有任何其他属性的 Functor 示例。 我想出的工作示例是 data MyFunctor a b = MyFuncto
我正在努力将 GHC/Arr.hs 移植到弗雷格。 数组定义: data Array i e = Array{u,l::i,n::Int,elems::(JArray e)} 有函数: amap ::
我不认为这是可能的,如果它是或为什么不是这样,我很好奇: class A { } 我想将 A 的实例视为函数,例如 A a = new A(); a(); or a(3); etc... 这是为了在特
我正在使用 C++ 模板传入 Strategy 仿函数以更改函数的行为。它工作正常。我传递的仿函数是一个没有存储的无状态类,它只是以经典的仿函数方式重载 () 运算符。 template int f
我有一个类,我试图指向其成员函数,问题是我不断收到此错误 reference to non-static member function must be called根据我的理解,需要指向一个成员函数
我一直潜伏在这里,试图弄清楚 Functor 是否可以做我需要它做的事情。 我想做的是包装对类方法的调用,并以某种方式捕获函数返回的值。鉴于我的 Functor 类,我需要做些什么才能将我的评论转化为
我想用 c++ 编写一个函数,它接受一个 int 类型的变量,它的作用是定义一个仿函数的重载运算符 () 并将该仿函数作为输出参数返回。例如: template Functor myFunc(doub
我是一名优秀的程序员,十分优秀!