gpt4 book ai didi

haskell - haskell 的 "Zippable"类?

转载 作者:行者123 更新时间:2023-12-04 14:11:22 27 4
gpt4 key购买 nike

试图熟悉 Foldable 等伟大的想法, Functor等。我正在为 2*2 矩阵编写数据结构。它不是真正的用途,所以我认为这个幼稚的实现是一个好的开始:

data Matrix2d a = M2 a a a a

我希望这是一个 Num实例
instance Num a => Num (Matrix2d a) where
(M2 a0 b0 c0 d0) + (M2 a1 b1 c1 d1) = M2 (a0+a1) (b0+b1) (c0+c1) (d0+d1)
-- ....

这似乎不对。我不想输入 +这个明显的定义是五次。当然还有更多抽象的空间。我更喜欢类似的东西
(+) = fzipWith (+) -- f does not mean anything here

这实际上很容易实现:
class Zippable z where
fzipWith :: (a -> b -> c) -> z a -> z b -> z c

instance Zippable Matrix2 where
fzipWith f (M2 x y z w) (M2 a b c d) = M2 (f x a) (f y b) (f z c) (f w d)

但是,我在 hoogle 中找不到任何可以使用的东西。我觉得很奇怪,因为这种抽象看起来很自然。有 Foldable ,有 Functor --- 为什么不 Zippable ?

问题:
  • 有没有提供这个功能的模块?
  • 如果不是(我相信是这种情况),我有什么选择?定义我自己的类(class)是最好的选择,还是有更好的选择?
  • 最佳答案

    你不能只用 Functor , 但使用 Applicative你可以做

    fzipWith f za zb = f <$> za <*> zb
    Applicative [] 的默认实例不会做你想做的事;它需要每个 ab .但我相信有一个 ZipList newtype 某处为您提供了一个以您期望的方式压缩的实例。 (不,我不知道它到底住在哪里。)

    请注意,这适用于任意数量的参数:
    f <$> za <*> zb <*> zc <*> zd

    所以你不需要 zipWith , zipWith3 , zipWith4等功能。

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

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