gpt4 book ai didi

haskell "pseudo-functor"

转载 作者:行者123 更新时间:2023-12-03 14:29:40 26 4
gpt4 key购买 nike

我有一个多项式

data Poly a = Poly [a]

我希望能够做类似 fmap (take 3) polynomial 的事情但我不能,因为 Poly不是真正的仿函数,因为 f我在 fmap 中使用只能是 [a] -> [b] 类型,不是 a -> b .

有什么成语或方式可以表达我想要的吗?

编辑:这是一个可以做我想要的功能
myMap :: ([a] ->[b]) -> P a -> P b
myMap f (P x) = P (f x)

用法:
*Main> myMap (take 3) (P [1..])
P [1,2,3]

您可以从类型 sig 中看到它几乎是 fmap,但不完全是。我显然有能力为 myMap 编写代码,但我只想知道是否应该使用另一个成语。

最佳答案

由于您允许将任何函数应用于系数列表,因此您的数据类型实际上仅用于两个目的。

  • 你会得到额外的类型安全,因为 Poly [a]不同于 [a] .
  • 您可以定义不同的实例。

  • 如果您不需要其中任何一个,您也可以使用类型别名。
    type Poly a = [a]

    现在您可以直接对其应用任何列表函数。

    另一方面,如果您想要一个独特的类型,您可能会发现 the newtype package有用。例如,给定这个实例。
    instance Newtype (Poly a) [a] where
    pack = Poly
    unpack (Poly x) = x

    你现在可以写这样的东西
    foo :: Poly a -> Poly a
    foo = over Poly (take 3)

    尽管如果您的 myMap 这可能是矫枉过正足以满足您的目的。

    撇开所有这些不谈,我认为以这种方式公开数据类型的表示一开始可能不是一个好主意,因为它会使您的其余代码密切依赖于这种表示。

    这使得以后更难更改为不同的表示。例如,您可能希望更改为稀疏表示,例如
    data Poly a = Poly [(a, Int)]

    哪里 Int是词的力量。我建议考虑您想要公开哪些操作,并将自己限制在这些操作上。例如,有一个 Functor 可能是有意义的。在每个元素的基础上工作的实例。
    instance Functor Poly where
    fmap f (Poly x) = Poly $ map f x

    现在,对稀疏表示的更改使客户端代码保持不变。只有实例(以及少数依赖于表示的其他函数)必须改变。
    instance Functor Poly where
    fmap f (Poly x) = Poly $ map (first f) x

    关于 haskell "pseudo-functor",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7616904/

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