gpt4 book ai didi

haskell - 为 n 深度结构生成实例?

转载 作者:行者123 更新时间:2023-12-02 16:28:49 25 4
gpt4 key购买 nike

作者:n-depth structure我的意思是某种嵌套一种结构的结构 n次,例如 [[a]]是一个 2 深度列表。

我随机想到 Functor 的一个实例, FoldableTraversable今天的 3 深度列表 ( [[[a]]] ),发现了一些规律,如下所示:

instance Functor [[[]]] where
fmap f n = fmap (fmap (fmap f)) n

instance Foldable [[[]]] where
foldMap f n = foldMap (foldMap (foldMap f)) n

instance Traversable [[[]]] where
sequenceA n =
let fz = \z -> sequenceA z
fy = \y -> sequenceA (fmap fz y)
fx = \x -> sequenceA (fmap fy x)
in fx n

我认为这可以通过某种方式安全地自动化,不仅适用于 []但任何具有这些实例的结构(如 Vector ),不仅是 3 深度,而且是任何深度,只要它大于零。

我认为类似data Depth = One | Succ Depth将用于编译时深度计算,但除此之外,我不知道它是如何进行的。您认为这实际上可能吗?你会如何实现它?

最佳答案

你所说的本质上是仿函数的组合(具体来说,是n倍自组合,但这并不重要)。

确实such compositions可以自动创建 FunctorApplicativeFoldableTraversable 类的实例。此外,您还可以拥有一堆 monad transformers (本质上是仿函数组合的另一种方法)。

要使用相同的仿函数使其n折叠,您需要一个合适的包装器。

{-# LANGUAGE DataKinds, KindSignatures, GADTs, FlexibleInstances, FlexibleContexts #-}
data Nat = Z | S Nat

data NCompose :: Nat -> (* -> *) -> * -> * where
Singly :: f x -> NCompose (S Z) f x
Multiplie :: NCompose n f (f x) -> NCompose (S n) f x

instance Functor (NCompose Z f) where
fmap _ _ = undefined -- safe, since there's no constructor for `NCompose Z f x`
instance (Functor f, Functor (NCompose n f)) => Functor (NCompose (S n) f) where
fmap f (Singly q) = Singly $ fmap f q
fmap f (Multiplie q) = Multiplie $ fmap (fmap f) q

关于haskell - 为 n 深度结构生成实例?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30717009/

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