gpt4 book ai didi

haskell - 为什么 `((,) r)` 不是 Applicative 的 Functor?

转载 作者:行者123 更新时间:2023-12-04 09:45:37 26 4
gpt4 key购买 nike

来自 functors that are not applicatives :

A type constructor which is a Functor but not an Applicative. A simple example is a pair:

instance Functor ((,) r) where
fmap f (x,y) = (x, f y)

But there is no way how to define its Applicative instance without imposing additional restrictions on r. In particular, there is no way how to define pure :: a -> (r, a) for an arbitrary r.



问题一:为什么会这样?这里是如何 pure可以使用函数 f类型 a -> b :
(pure f) (pure x, pure y) = (pure x, pure f y)

从那里, pure :: a -> (r, a) 的定义可能取决于 r是。例如,如果 rInteger ,那么你可以定义
pure x = (0 :: Integer, x)

在您的实例声明中。那么问题是什么?

问题二:我们能否概括地说,如果 F是仿函数,则 <*>总是可以定义的,但是 pure可能并不总是被定义?

最佳答案

假设我们有

pure :: forall r a. a -> (r, a)

那么,特别是,我们有
magic :: forall r. r
magic = fst (pure ())

现在,我们可以特化类型变量 r要得到
magic :: Void

在哪里 Void是没有构造函数的数据类型,这意味着
magic = undefined

但由于类型变量(以及专门化它们的类型)没有运行时角色,这意味着 magic总是未定义的。

我们发现 ((,) r)可以是 Applicative仅适用于有人居住的 r .还有更多。对于任何这样的例子,我们可以写
munge :: r -> r -> r
munge r0 r1 = fst ( pure (\ _ _ -> ()) <*> (r0, ()) <*> (r1, ()) )

r 上定义二元运算符. Applicative法律有效地告诉我们 munge必须是吸收 magic 的关联运算符在任一侧。

也就是说有一个明智的例子
instance Monoid r => Applicative ((,) r) where
pure a = (mempty, a)
(r0, f) <*> (r1, s) = (mappend r0 r1, f s)

(正是当您从 pure=return; (<*>)=ap 中获取 Monad (Writer r) 时得到的结果)。

当然,一些学究会争辩说,定义是合法的(如果没有帮助的话)
instance Monoid r where
mempty = undefined
mappend _ _ = undefined
-- Monoid laws clearly hold

但我认为任何合理的类型类实例都应该对定义的语言片段做出重要贡献。

关于haskell - 为什么 `((,) r)` 不是 Applicative 的 Functor?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44104502/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com