gpt4 book ai didi

haskell - Haskell 是否有一个贪婪的 zipper (一个保留所有元素的 zipper )?

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

我不确定我的命名法在这里是否正确,但我想知道 Haskell 中是否有一个贪婪的 zip 函数。这意味着如果我有

a = [1, 2, 3]
b = [4, 5]
zip' a b
#=> [(Just 1, Just 4),(Just 2, Just 5),(Just 3, Nothing)]

...在哪里 zip'是贪婪的 zip 函数,它会返回一个长列表的长度的元组列表,其中较长的列表有一个元素,但较短的列表没有 Nothing放在各自的元组位置。我不是在问如何写这个,而是想知道它是否作为内置存在。

这是我的实现(可能不是很好)
zip' :: [a] -> [b] -> [(Maybe a, Maybe b)]
zip' (a:xs) [] = (Just a, Nothing) : zip' xs []
zip' [] (b:ys) = (Nothing, Just b) : zip' [] ys
zip' [] _ = []
zip' (a:xs) (b:ys) = (Just a, Just b) : zip' xs ys

最佳答案

贪婪的 zip 可以通过非排他析取类型巧妙地表达(与 Either 相反,它是排他析取)。两个流行的软件包提供了这一点。一种是极简、无依赖的data-or :

GHCi> import Data.Or
GHCi> :t zipOr
zipOr :: [a] -> [b] -> [Or a b]
GHCi> zipOr [1, 2, 3] [4, 5]
[Both 1 4,Both 2 5,Fst 3]

另一个是 these ,它带有很多花里胡哨:
GHCi> import Data.These 
GHCi> import Data.Align
GHCi> :t align
align :: Align f => f a -> f b -> f (These a b)
GHCi> align [1, 2, 3] [4, 5]
[These 1 4,These 2 5,This 3]

我相信 Or a bThese a b(Maybe a, Maybe b) 更好地表达你的意图(后一种类型包括 (Nothing, Nothing) ,贪婪的 zip 永远不会产生)。不过,你可以表达你的 zip'使用 zipOrWith来自 Data.Or ...
import Data.Or

zip' :: [a] -> [b] -> [(Maybe a, Maybe b)]
zip' = zipOrWith $ \xy -> case xy of
Both x y -> (Just x, Just y)
Fst x -> (Just x, Nothing)
Snd y -> (Nothing, Just y)

... 或 alignWith来自 Data.Align :
import Data.These
import Data.Align

zip' :: Align f => f a -> f b -> f (Maybe a, Maybe b)
zip' = alignWith $ \xy -> case xy of
These x y -> (Just x, Just y)
This x -> (Just x, Nothing)
That y -> (Nothing, Just y)
Data.Align ,实际上,以 padZip 的名称提供您的功能.

关于haskell - Haskell 是否有一个贪婪的 zipper (一个保留所有元素的 zipper )?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41336345/

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