gpt4 book ai didi

haskell - 函数重载以最小化重复模式

转载 作者:行者123 更新时间:2023-12-05 08:39:10 27 4
gpt4 key购买 nike

为了学习 haskell,我一直在构建一个非常类似于 Python Pandas 的框架。

在这种情况下,我定义了一个名为 Series 的数据

    data Series
= SInt [Int] ByteString
| SFloat [Float] ByteString
| SByteString [ByteString] ByteString
deriving (Show, Eq)

但是由于 Haskell 类型系统和我的知识,我使用这种非常重复的编码模式编写简单的函数,例如标量和

sScalarSum :: Series -> Either Int Float
sScalarSum (SInt i _) = Left $ Data.List.sum i
sScalarSum (SFloat i _) = Right $ Data.List.sum i
sScalarSum (SByteString _ _) =
error "Cannot sum strings. use applyDType to convert series to float or int"

是否有任何形式的重载来最小化此代码?

我不能做这样的事情吗?

sScalarSum :: Series -> Either Int Float
sScalarSum (Series i _) = Left $ Data.List.sum i

最佳答案

您不需要在构造函数级别对这些信息进行编码。将 Series 定义为 anything

的参数化列表
data Series a = Series [a] ByteString

但将 sScalarSum 限制为可求和类型。

sScalarSum :: Num a => Series a -> a
sScalarSum (Series values _) = Data.List.sum values

更一般地说,您可以为 Series 定义一个 Foldable 实例,并直接在您的值上使用 sum

instance Foldable Series where
foldMap f (Series values _) = foldMap f values

sScalarSum :: Num a => Series a -> a
sScalarSum = Data.List.sum

关于haskell - 函数重载以最小化重复模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60816401/

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