sách gpt4 ai đã đi

Cách xây dựng một thể hiện Applicative với các ràng buộc (tương tự như xây dựng một thể hiện Monad bằng ContT)

In lại 作者:行者123 更新时间:2023-12-04 01:05:50 31 4
mua khóa gpt4 Nike

This question处理构建一个适当的Monad来自单子(monad)的实例,但仅在某些约束下 - 例如Bộ .诀窍是将其包装成 ContT ,它将约束推迟到包装/展开其值。

现在我想对 Applicative 做同样的事情s。特别是,我有一个 Applicative pure 具有类型类约束的实例。有没有类似的技巧来构造一个有效的 Applicative实例?

(是否有像 there is for monads 一样的“所有应用仿函数之母”?)

1 Câu trả lời

từ Category 开始可能是最一致的可用方式。 ,对对象有限制是很自然的:对象!

class Category k where
type Object k :: * -> Constraint
id :: Object k a => k a a
(.) :: (Object k a, Object k b, Object k c)
=> k b c -> k a b -> k a c

然后我们定义类似于 how Edward does it 的仿函数
class (Category r, Category t) => Functor f r t | f r -> t, f t -> r where
fmap :: (Object r a, Object t (f a), Object r b, Object t (f b))
=> r a b -> t (f a) (f b)

所有这些工作都很好,并在 constrained-categories library 中实现。 ,哪——真丢人! – 仍然不在 Hackage 上。
Applicative不幸的是,做起来不那么简单。 Mathematically, these are monoidal functors , 所以 we first need单曲面类别。 categories has that class ,但它不适用于基于约束的版本,因为我们的对象总是任何类型的 *有一个约束。所以我做的是编一个 Curry lớp học , 哪种近似。

然后,我们可以做 Monoidal functors :
class (Functor f r t, Curry r, Curry t) => Monoidal f r t where
pure :: (Object r a, Object t (f a)) => a `t` f a
fzipWith :: (PairObject r a b, Object r c, PairObject t (f a) (f b), Object t (f c))
=> r (a, b) c -> t (f a, f b) (f c)

这实际上等价于 Applicative当我们有适当的封闭笛卡尔类别时。在受限类别版本中,不幸的是,签名看起来非常糟糕:
  (<*>) :: ( Applicative f r t
, MorphObject r a b, Object r (r a b)
, MorphObject t (f a) (f b), Object t (t (f a) (f b)), Object t (f (r a b))
, PairObject r (r a b) a, PairObject t (f (r a b)) (f a)
, Object r a, Object r b, Object t (f a), Object t (f b))
=> f (r a b) `t` t (f a) (f b)

尽管如此,它确实有效——对于不受约束的情况,呵呵!我还没有找到一种方便的方法来使用它与非平凡的约束。

Nhưng, Applicative相当于 Monoidal ,并且可以按照 the Bộ ví dụ 中的演示使用.

关于haskell - 如何构造带约束的 Applicative 实例(类似于使用 ContT 构造 Monad 实例),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21099466/

31 4 0
Bài viết được đề xuất: javascript - 如何清除 Javascript 中的下拉列表控件
Bài viết được đề xuất: javascript - 展平对象中的数组
Bài viết được đề xuất: strapi - 将调试器附加到 Strapi 服务器
Bài viết được đề xuất: ASP.NET 应用程序和 CPU 使用率
行者123
Hồ sơ cá nhân

Tôi là một lập trình viên xuất sắc, rất giỏi!

Nhận phiếu giảm giá Didi Taxi miễn phí
Mã giảm giá Didi Taxi
Giấy chứng nhận ICP Bắc Kinh số 000000
Hợp tác quảng cáo: 1813099741@qq.com 6ren.com