haskell - 将值映射转换为元组列表

标签 haskell

我正在尝试扩展我的函数toTuple,以便它需要[(d1, Just x), (d2, Just y), (d3, Just z)] 并产生 [(d1, d2, y), (d2, d3, z)]

import qualified Data.Function.Step.Discrete.Open as SF
import qualified Data.Map as Map

newtype DayMap a = DayMap (SF.SF Day (Maybe a))
  deriving stock (Show, Functor)

toTuple :: Map.Map Day (Maybe a) -> [(Day, Maybe Integer)]
toTuple a = produceList 
    where
      produceList = Map.toList (getDM td3)

getDM :: DayMap a -> Map.Map Day (Maybe a)
getDM (DayMap sf@(SF.SF m hi)) = m

td3 :: DayMap Integer
td3 = DayMap.insert (Just $ fromGregorian 2010 01 01) (Just $ fromGregorian 2012 01 01) 22 DayMap.empty

它目前产生这个:

> toTuple (getDM td3)
[(2010-01-01,Nothing),(2012-01-02,Just 22)]

即值 Just 222010-01-012012-01-02 之间相关,在此之前为空。

所以在这种情况下我想以 [(2010-01-01, 2012-01-02, (Just 22))] 结束。

我不清楚如何扩展我的 toTuple 函数。任何提示将不胜感激。

最佳答案

您可以使用以下方式处理此类列表:

toTuple :: [(a, b)] -> [(a, a, b)]
toTuple [] = []
toTuple xs@(_:xt) = zipWith f xs xt
    where f (x, _) (y, z) = (x, y, z)

这里我们将一个空列表映射到一个空列表上。通过使用“压缩函数”f 压缩列表 (xs) 及其尾部 (xt) 来处理非空列表。 f 获取“前一个”元组 x 的第一项和“下一个”元组 (y, z),并构造一个 3 -元组(x, y, z)

关于haskell - 将值映射转换为元组列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57170859/

相关文章:

haskell - Haskell 中的孤立实例

haskell - 在 Haskell 中执行断言

haskell - 在惯用的 Haskell 项目中,主模块应该保存在哪里?

c# - 从 C# 调用 Haskell

haskell - mapA 如何与 Haskell 中的流函数 Arrow 配合使用?

haskell - 为什么GHC 与gcc 和g++ 一起发布?

haskell - 将常量应用于数据类型的所有字段

haskell - 如何在Haskell的ErrorT内部使用catch?

haskell - 如何在haskell中进行分组和计数?

解析函数与Happy的应用