我正在尝试扩展我的函数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 22
在 2010-01-01
和 2012-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/