我怎么能zip两个像
["Line1","Line2","Line3"]
["Line4","Line5"]
Run Code Online (Sandbox Code Playgroud)
不丢弃第一个列表中的休息元素?
如果可以的话,我想用空列表压缩额外的元素.
我正在ApplicativeHaskell的Haskell编程中阅读Haskell.为了更好地理解它,我想出了以下Applicative列表定义:
-- Named as pure' and "app" to avoid confusion with builtin versions
class Applicative' f where
pure' :: a -> f a
app :: f (a->b) -> f a -> f b
instance Applicative' [] where
pure' x = [x]
app _ [] = []
app [g] (x:xs) = [(g x)] ++ app [g] xs
app (g:gs) (x:xs) = [(g x)] ++ app gs xs
-- fmap functions could be defined as:
fmap1' :: (Applicative' …Run Code Online (Sandbox Code Playgroud) 我正在尝试编写一个Haskell函数,它将获取三个列表并返回其元素总和的列表.目前我正在尝试使用zipWith3:
sum3 :: Num a => [a] -> [a] -> [a] -> [a]
sum3 xs ys zs = zipWith3 (\x y z -> x+y+z) xs ys zs
Run Code Online (Sandbox Code Playgroud)
问题是它只适用于相同长度的列表.但我希望sum3使用不等长的列表,以便这样做
sum3 [1,2,3] [4,5] [6]
Run Code Online (Sandbox Code Playgroud)
会回来的
[11,7,3]
Run Code Online (Sandbox Code Playgroud)
我认为我应该重新定义zipWith3来处理不等长的列表,但是无法弄清楚如何做(我怀疑我必须用尽所有空列表的可能性).有解决方案吗?
我有一个功能:
mapAtOriginal :: (a -> a) -> [Int] -> [a] -> [a]
mapAtOriginal f is xs = helper 0 is xs
where
helper _ [] xs = xs
helper c (i:is) (x:xs)
| c < i = x : helper (c+1) (i:is) xs
| otherwise = f x : helper (c+1) is xs
Run Code Online (Sandbox Code Playgroud)
它是这样的:
mapAtOriginal (*2) [0,3] [1,2,3,4] -- == [2,2,3,8]
Run Code Online (Sandbox Code Playgroud)
因此,我想使用map功能重写它。我知道这map适用于列表的每个元素,但是,我只需要将其应用于特定的索引。
我该怎么做?