gpt4 book ai didi

haskell - 处理 haskell 元组的好函数和技术?

转载 作者:行者123 更新时间:2023-12-04 16:22:39 25 4
gpt4 key购买 nike

最近我一直在用元组和元组列表做很多工作,我一直在想我是否明智。

事情感觉很尴尬和笨拙,这对我来说表明我做错了什么。

例如,我编写了三个便利函数,用于在 3 个值的元组中获取第一个、第二个和第三个值。

我有没有更好的方法?

是否有更通用的函数可以让您组合和操作元组数据?

以下是我正在尝试做的一些事情,感觉应该是可以概括的。

提取值:
我需要为大小为 2、3、4 和 5 等的元组创建 fst、snd 等版本吗?

fst3(x,_,_) = x
fst4(x,_,_,_) = x

操纵值:
您可以增加对列表中每个元组的最后一个值,然后使用相同的函数来增加三元组列表中每个元组的最后一个值吗?

压缩和解压缩值:
有一个zip和一个zip3。我还需要一个 zip4 吗?或者有什么方法可以创建一个通用的 zip 函数?

抱歉,如果这看起来很主观,老实说,我不知道这是否可能,或者我是否在每次需要通用解决方案时都在浪费时间编写 3 个额外的函数。

感谢您提供的任何帮助!

最佳答案

提取值

是的,你需要写fstN你自己。但是为什么不在模式匹配中提取它呢?

压缩和解压缩值

Data.List已提供高达 zip7 .一般zipN ,使用 ZipList。

How to zip multiple lists in Haskell? .

操纵值

不是没有扩展。由于所有元组都是不同的类型,因此您必须创建一个类型类,例如:

{-# LANGUAGE MultiParamTypeClasses, FlexibleInstances, FunctionalDependencies #-}

class Firstable a b c | a -> b, a -> c where
firstOf :: a -> b
restOf :: a -> c
concatenate :: b -> c -> a

instance Firstable [a] a [a] where
firstOf = head
restOf = tail
concatenate = (:)

instance Firstable (a,b) a b where
firstOf = fst
restOf = snd
concatenate = (,)

instance Firstable (a,b,c) a (b,c) where
firstOf (x,_,_) = x
restOf (_,x,y) = (x,y)
concatenate x (y,z) = (x,y,z)

instance Firstable (a,b,c,d) a (b,c,d) where
firstOf (x,_,_,_) = x
restOf (_,x,y,z) = (x,y,z)
concatenate x (y,z,w) = (x,y,z,w)

instance Firstable (a,b,c,d,e) a (b,c,d,e) where
firstOf (x,_,_,_,_) = x
restOf (_,x,y,z,w) = (x,y,z,w)
concatenate x (y,z,w,t) = (x,y,z,w,t)

然后你可以使用
incFirst :: (Num b, Firstable a b c) => a -> a
incFirst x = (1 + firstOf x) `concatenate` restOf x

main = do
print $ map incFirst [(1,2),(3,4),(5,6)]
print $ map incFirst [(1,3,6,7),(2,5,-2,4)]

( lastOf 类似。)

但是为什么不使用单独的函数呢?

关于haskell - 处理 haskell 元组的好函数和技术?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2586287/

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