我正在寻找haskell中的函数来压缩两个长度可能不同的列表.
我可以找到的所有zip函数只删除比另一个更长的列表的所有值.
例如:在我的练习中,我有两个示例列表.
如果第一个比第二个短,我必须用0填充.否则我必须使用1.
我不允许使用任何递归.我只需要使用更高阶的函数.
我可以使用任何功能吗?
到目前为止,我真的找不到任何解决方案.
适用于Monoidal Functor:
mappend :: f -> f -> f
$ :: (a -> b) -> a -> b
<*> :: f(a -> b) -> f a -> f b
Run Code Online (Sandbox Code Playgroud)
但是我没有在应用类型类的定义中看到有关Monoid的任何参考,你能告诉我为什么吗?
定义:
class Functor f => Applicative (f :: * -> *) where
pure :: a -> f a
(<*>) :: f (a -> b) -> f a -> f b
GHC.Base.liftA2 :: (a -> b -> c) -> f a -> f b -> f c
(*>) :: f a …Run Code Online (Sandbox Code Playgroud) 我目前正在Haskell学习Applicatives.如果我没有错,则列表有两个不同的Applicative实例(List和ZipList- 第二个被定义为包装List值的newtype).该ZipList应用性情况下,似乎对我来说更直观.
这可能是一个愚蠢的问题,但是有一个特定的原因ZipList不是列表的默认应用实例.
pure (+) <*> [1,2,3] <*> [4,5,6]
-- [5,6,7,6,7,8,7,8,9]
pure (+) <*> ZipList [1,2,3] <*> ZipList [4,5,6]
-- ZipList [5,7,9]
Run Code Online (Sandbox Code Playgroud)
是因为Applicative List的分布式版本也恰好有Monad实例吗?