haskell Standard list functions(列表的标准库函数)

04_Haskell_列表_List_基础 04_Haskell_列表_List_基础.md 阅读详情


-- Standard list functions


module PreludeList (
    map, (++), filter, concat, concatMap, 
    head, last, tail, init, null, length, (!!), 
    foldl, foldl1, scanl, scanl1, foldr, foldr1, scanr, scanr1,
    iterate, repeat, replicate, cycle,
    take, drop, splitAt, takeWhile, dropWhile, span, break,
    lines, words, unlines, unwords, reverse, and, or,
    any, all, elem, notElem, lookup,
    sum, product, maximum, minimum, 
    zip, zip3, zipWith, zipWith3, unzip, unzip3)
  where

import qualified Char(isSpace)

infixl 9  !!
infixr 5  ++
infix  4  `elem`, `notElem`

-- Map and append

map :: (a -> b) -> [a] -> [b]
map f []     = []
map f (x:xs) = f x : map f xs


(++) :: [a] -> [a] -> [a]
[]     ++ ys = ys
(x:xs) ++ ys = x : (xs ++ ys)


filter :: (a -> Bool) -> [a] -> [a]
filter p []                 = []
filter p (x:xs) | p x       = x : filter p xs
                | otherwise = filter p xs


concat :: [[a]] -> [a]
concat xss = foldr (++) [] xss


concatMap :: (a -> [b]) -> [a] -> [b]
concatMap f = concat . map f

-- head and tail extract the first element and remaining elements,
-- respectively, of a list, which must be non-empty.  last and init
-- are the dual functions working from the end of a finite list,
-- rather than the beginning.


head             :: [a] -> a
head (x:_)       =  x
head []          =  error "Prelude.head: empty list"


tail             :: [a] -> [a]
tail (_:xs)      =  xs
tail []          =  error "Prelude.tail: empty list"


last             :: [a] -> a
last [x]         =  x
last (_:xs)      =  last xs
last []          =  error "Prelude.last: empty list"


init             :: [a] -> [a]
init [x]         =  []
init (x:xs)      =  x : init xs
init []          =  error "Prelude.init: empty list"


null             :: [a] -> Bool
null []          =  True
null (_:_)       =  False

-- length returns the length of a finite list as an Int.

length           :: [a] -> Int
length []        =  0
length (_:l)     =  1 + length l

-- List index (subscript) operator, 0-origin

(!!)                :: [a] -> Int -> a
xs     !! n | n < 0 =  error "Prelude.!!: negative index"
[]     !! _         =  error "Prelude.!!: index too large"
(x:_)  !! 0         =  x
(_:xs) !! n         =  xs !! (n-1)

-- foldl, applied to a binary operator, a starting value (typically the
-- left-identity of the operator), and a list, reduces the list using
-- the binary operator, from left to right:
--  foldl f z [x1, x2, ..., xn] == (...((z `f` x1) `f` x2) `f`...) `f` xn
-- foldl1 is a variant that has no starting value argument, and  thus must
-- be applied to non-empty lists.  scanl is similar to foldl, but returns
-- a list of successive reduced values from the left:
--      scanl f z [x1, x2, ...] == [z, z `f` x1, (z `f` x1) `f` x2, ...]
-- Note that  last (scanl f z xs) == foldl f z xs.
-- scanl1 is similar, again without the starting element:
--      scanl1 f [x1, x2, ...] == [x1, x1 `f` x2, ...]


foldl            :: (a -> b -> a) -> a -> [b] -> a
foldl f z []     =  z
foldl f z (x:xs) =  foldl f (f z x) xs


foldl1           :: (a -> a -> a) -> [a] -> a
foldl1 f (x:xs)  =  foldl f x xs
foldl1 _ []      =  error "Prelude.foldl1: empty list"


scanl            :: (a -> b -> a) -> a -> [b] -> [a]
scanl f q xs     =  q : (case xs of
                            []   -> []
                            x:xs -> scanl f (f q x) xs)


scanl1           :: (a -> a -> a) -> [a] -> [a]
scanl1 f (x:xs)  =  scanl f x xs
scanl1 _ []      =  []

-- foldr, foldr1, scanr, and scanr1 are the right-to-left duals of the
-- above functions.


foldr            :: (a -> b -> b) -> b -> [a] -> b
foldr f z []     =  z
foldr f z (x:xs) =  f x (foldr f z xs)


foldr1           :: (a -> a -> a) -> [a] -> a
foldr1 f [x]     =  x
foldr1 f (x:xs)  =  f x (foldr1 f xs)
foldr1 _ []      =  error "Prelude.foldr1: empty list"


scanr             :: (a -> b -> b) -> b -> [a] -> [b]
scanr f q0 []     =  [q0]
scanr f q0 (x:xs) =  f x q : qs
                     where qs@(q:_) = scanr f q0 xs 


scanr1          :: (a -> a -> a) -> [a] -> [a]
scanr1 f []     =  []
scanr1 f [x]    =  [x]
scanr1 f (x:xs) =  f x q : qs
                   where qs@(q:_) = scanr1 f xs 

-- iterate f x returns an infinite list of repeated applications of f to x:
-- iterate f x == [x, f x, f (f x), ...]

iterate          :: (a -> a) -> a -> [a]
iterate f x      =  x : iterate f (f x)

-- repeat x is an infinite list, with x the value of every element.

repeat           :: a -> [a]
repeat x         =  xs where xs = x:xs

-- replicate n x is a list of length n with x the value of every element

replicate        :: Int -> a -> [a]
replicate n x    =  take n (repeat x)

-- cycle ties a finite list into a circular one, or equivalently,
-- the infinite repetition of the original list.  It is the identity
-- on infinite lists.


cycle            :: [a] -> [a]
cycle []         =  error "Prelude.cycle: empty list"
cycle xs         =  xs' where xs' = xs ++ xs'

-- take n, applied to a list xs, returns the prefix of xs of length n,
-- or xs itself if n > length xs.  drop n xs returns the suffix of xs
-- after the first n elements, or [] if n > length xs.  splitAt n xs
-- is equivalent to (take n xs, drop n xs).


take                   :: Int -> [a] -> [a]
take n _      | n <= 0 =  []
take _ []              =  []
take n (x:xs)          =  x : take (n-1) xs


drop                   :: Int -> [a] -> [a]
drop n xs     | n <= 0 =  xs
drop _ []              =  []
drop n (_:xs)          =  drop (n-1) xs


splitAt                  :: Int -> [a] -> ([a],[a])
splitAt n xs             =  (take n xs, drop n xs)

-- takeWhile, applied to a predicate p and a list xs, returns the longest
-- prefix (possibly empty) of xs of elements that satisfy p.  dropWhile p xs
-- returns the remaining suffix.  span p xs is equivalent to 
-- (takeWhile p xs, dropWhile p xs), while break p uses the negation of p.


takeWhile               :: (a -> Bool) -> [a] -> [a]
takeWhile p []          =  []
takeWhile p (x:xs) 
            | p x       =  x : takeWhile p xs
            | otherwise =  []


dropWhile               :: (a -> Bool) -> [a] -> [a]
dropWhile p []          =  []
dropWhile p xs@(x:xs')
            | p x       =  dropWhile p xs'
            | otherwise =  xs


span, break             :: (a -> Bool) -> [a] -> ([a],[a])
span p []            = ([],[])
span p xs@(x:xs') 
            | p x       =  (x:ys,zs) 
            | otherwise =  ([],xs)
                           where (ys,zs) = span p xs'

break p                 =  span (not . p)

-- lines breaks a string up into a list of strings at newline characters.
-- The resulting strings do not contain newlines.  Similary, words
-- breaks a string up into a list of words, which were delimited by
-- white space.  unlines and unwords are the inverse operations.
-- unlines joins lines with terminating newlines, and unwords joins
-- words with separating spaces.


lines            :: String -> [String]
lines ""         =  []
lines s          =  let (l, s') = break (== '\n') s
                      in  l : case s' of
                                []      -> []
                                (_:s'') -> lines s''


words            :: String -> [String]
words s          =  case dropWhile Char.isSpace s of
                      "" -> []
                      s' -> w : words s''
                            where (w, s'') = break Char.isSpace s'


unlines          :: [String] -> String
unlines          =  concatMap (++ "\n")


unwords          :: [String] -> String
unwords []       =  ""
unwords ws       =  foldr1 (\w s -> w ++ ' ':s) ws

-- reverse xs returns the elements of xs in reverse order.  xs must be finite.

reverse          :: [a] -> [a]
reverse          =  foldl (flip (:)) []

-- and returns the conjunction of a Boolean list.  For the result to be
-- True, the list must be finite; False, however, results from a False
-- value at a finite index of a finite or infinite list.  or is the
-- disjunctive dual of and.

and, or          :: [Bool] -> Bool
and              =  foldr (&&) True
or               =  foldr (||) False

-- Applied to a predicate and a list, any determines if any element
-- of the list satisfies the predicate.  Similarly, for all.

any, all         :: (a -> Bool) -> [a] -> Bool
any p            =  or . map p
all p            =  and . map p

-- elem is the list membership predicate, usually written in infix form,
-- e.g., x `elem` xs.  notElem is the negation.

elem, notElem    :: (Eq a) => a -> [a] -> Bool
elem x           =  any (== x)
notElem x        =  all (/= x)

-- lookup key assocs looks up a key in an association list.

lookup           :: (Eq a) => a -> [(a,b)] -> Maybe b
lookup key []    =  Nothing
lookup key ((x,y):xys)
    | key == x   =  Just y
    | otherwise  =  lookup key xys

-- sum and product compute the sum or product of a finite list of numbers.

sum, product     :: (Num a) => [a] -> a
sum              =  foldl (+) 0  
product          =  foldl (*) 1

-- maximum and minimum return the maximum or minimum value from a list,
-- which must be non-empty, finite, and of an ordered type.

maximum, minimum :: (Ord a) => [a] -> a
maximum []       =  error "Prelude.maximum: empty list"
maximum xs       =  foldl1 max xs

minimum []       =  error "Prelude.minimum: empty list"
minimum xs       =  foldl1 min xs

-- zip takes two lists and returns a list of corresponding pairs.  If one
-- input list is short, excess elements of the longer list are discarded.
-- zip3 takes three lists and returns a list of triples.  Zips for larger
-- tuples are in the List library


zip              :: [a] -> [b] -> [(a,b)]
zip              =  zipWith (,)


zip3             :: [a] -> [b] -> [c] -> [(a,b,c)]
zip3             =  zipWith3 (,,)

-- The zipWith family generalises the zip family by zipping with the
-- function given as the first argument, instead of a tupling function.
-- For example, zipWith (+) is applied to two lists to produce the list
-- of corresponding sums.


zipWith          :: (a->b->c) -> [a]->[b]->[c]
zipWith z (a:as) (b:bs)
                 =  z a b : zipWith z as bs
zipWith _ _ _    =  []


zipWith3         :: (a->b->c->d) -> [a]->[b]->[c]->[d]
zipWith3 z (a:as) (b:bs) (c:cs)
                 =  z a b c : zipWith3 z as bs cs
zipWith3 _ _ _ _ =  []


-- unzip transforms a list of pairs into a pair of lists.  


unzip            :: [(a,b)] -> ([a],[b])
unzip            =  foldr (\(a,b) ~(as,bs) -> (a:as,b:bs)) ([],[])


unzip3           :: [(a,b,c)] -> ([a],[b],[c])
unzip3           =  foldr (\(a,b,c) ~(as,bs,cs) -> (a:as,b:bs,c:cs))
                          ([],[],[])


转载自:http://www.haskell.org/onlinereport/standard-prelude.html

Haskell语言的数据结构 通过data关键字定义代数数据类型。haskell这里,Shape可以是一个Circle(表示半径)或一个Rectangle(表示宽和高)。定义记录可以使用datahaskell在Haskell中,数据结构不仅是存储数据的方式,更是构建程序逻辑的重要工具。通过理解和运用列表、元组、代数数据类型、记录和字典,程序员可以设计出更高效、可维护的代码。随着程序规模的增大,选择合适的数据结构将显得尤为重要。对于新手开发者,掌握这些数据结构的使用是学习Haskell的重要一步。 阅读详情

相关推荐

hana::detail::variadic::foldl1用法的测试程序

hana::detail::variadic::foldl1用法的测试程序实现功能C++实现代码 实现功能 hana::detail::variadic::foldl1用法的测试程序 C++实现代码 #include <boost/hana/detail/variadic/foldl1.hpp> #include <boost/hana/assert.hpp> #include <boost/hana/equal.hpp> #include <laws/base.h

希望我的博客,能帮上你解决学习中工作中所遇到的问题 444

Haskell --- flod函数中 flodl 和 flodr 与 foldl1 和 foldr1

一个fold取一个二元函数,一个初始值(我喜欢管它叫累加值)和一个需要fold(折叠)的list。这个二元函数有两个参数,即累加值和list的首项(或尾项),返回值是新的累加值。 然后,以新的累加值和新的list首项调用该函数,如是继续。到list遍历完毕时,只剩下一个累加值,也就是最终的结果。 foldl -- 也叫做左折叠。它从list的左端开始折叠,用初始值和list的头部调用这二元函数,...

杨鑫newlife的专栏 1831

rio:Haskell的标准库

里约图书馆 Haskell的标准库 rio库的目标是使采用Haskell编写生产软件变得更加容易。 它旨在作为以下两者之间的交叉: 精心设计,值得信赖的库的集合 有用的Prelude替换 一套用于编写生产质量的Haskell代码的最佳实践 该存储库包含rio库和其他相关库,例如rio-orphans 。 FP Complete的Haskell网站上提供了的。 本自述文件讨论了项目目标并收集了其他参考信息。 标准库 尽管GHC附带了一个base库,以及许多其他常见的软件包,如directory和transformers ,但这些库提供的功能仍有很大差距。 出于更简约的base选择是设计使然,但这会导致一些不幸的后果: 对于给定的任务,通常不清楚使用哪个库是正确的 编写库时,通常会担心将依赖项添加到base之外的任何库中,这是因为创建了更大的依赖项覆盖区 通过避免添加依赖关系,许多库最终

【Haskell】列表

列表是编程中非常重要且常用的数据结构。本文将会介绍Haskell中列表的定义以及常用函数,让我们一起来重新认识一下这位熟悉而又陌生的朋友。

陈戏猿 2575

Haskell-找出有向图的所有最短路

利用Haskell语言找出有向图的所有最短路

real world haskell english

real world haskell english version

初识Haskell 三:函数function

对Discrete Mathematics Using a Computer的第一章Introduction to Haskell进行总结。环境Windows 函数毫无疑问是函数式语言的核心。 在Haskell中(无特殊指明,以下皆是指在Haskell下),一个表达式用函数完成计算被称为a function application,函数后加空格然后跟随参数(arguments),如有多个参...

weixin_33712987的博客 356

Docker容器n8n中 read/write files from disk 无法读取容器内文件解决方案

《n8n文件读写Docker部署常见问题解决方案》摘要:针对n8n 1.90.2版本在Docker环境下文件读写失败问题,本文分析常见错误包括路径错误(ENOENT)、权限不足(EACCES)及节点误用问题。核心解决方案为:1)通过-v参数挂载宿主机目录到容器(如/files);2)使用新版Read/WriteFilesfromDisk节点操作文件;3)确保权限设置正确。提供可直接导入的示例工作流JSON,演示从CSV读取到结构化数据处理的全流程。特别强调已部署用户需重新挂载卷的正确操作方式,并附解决方案对

m0_74822402的博客 2184

Haskell --- List Comprehension List集合操作

// 生成x在区间内的2倍值 ghci&gt; [x*2 | x &lt;- [1..10]]   [2,4,6,8,10,12,14,16,18,20] // 生成x在区间内的2倍值,并且大雨12的数 [x * 2 | x &lt;- [1..10], x * 2 &gt;= 12]    // 生成50到100之间,对7做除法余数是3的数  ghci&gt; [ x | x &lt;- [...

杨鑫newlife的专栏 2239

科研党必备:Zotero+Deepseek 打造AI文献阅读助手(附详细插件配置指南)

本文详细介绍了如何利用Zotero和Deepseek打造AI文献阅读助手,提升科研效率。从Zotero基础安装到中文文献处理插件茉莉花的配置,再到Deepseek API的集成与模型选择策略,全面覆盖了AI辅助阅读的关键环节。特别适合需要高效管理海量文献的科研工作者,显著提升文献筛选和分析速度。

backprop5master的博客 422

将机器人urdf模型转换为Mujoco环境下的mjcf模型

在使用gym环境进行人形模型站立训练的过程中,我想要将之前ros环境下的机器人urdf模型导入到mujoco环境下,这时候就需要将urdf模型转换为mujoco专用的mjcf模型。-AzureLoong.urdf是机器人模型(我这里使用青龙的模型);--custom_robot.xml是转换完成之后的机器人模型的名字和格式;包要求 Python 版本必须是 3.11 或更高),保证自己的其他训练环境和依赖不被干扰。首先将meshes文件迁移到需要输出的目录下,然后再运行转换命令。最后就可以成功输出了。

weixin_44334573的博客 3754

Haskell小例子

class MyEq a where myeq ::a->a->Bool myeq x y = not( mynoteq x y ) mynoteq ::a->a->Bool mynoteq x y = not (myeq x y) class BasicEq3 a where isEqual3 :: a -> a -> Bool isEq

daaoke的专栏 1778

通信算法之281:大疆DJI无人机ID-DJI DroneID开源工程-相关问题-协议信息问题

ZC序列的参数未知。但是,使用第一个或第二个零相关序列对每个OFDM符号进行相位调整,对于直接相邻于使用过的零相关序列的时间上的OFDM符号工作得很好,但对其它符号效果不佳。由于符号的顺序没有改变,而9 OFDM符号情况下的第一个OFDM符号没有用处,因此本存储库中的脚本对待所有突发都是有9个OFDM符号的,并且不对第一个OFDM符号做任何处理。棘手的地方在于需要生成比数据载波数量(始终为600)多1个的零相关序列,零化中间元素,将生成的样本映射到FFT的中心(采样率决定bin的数量),然后计算IFFT。

leegang12的专栏 1619

使用Relude进行总编程:告别partial函数的终极指南

Relude是一个安全、高效、用户友好且轻量级的Haskell标准库,旨在通过总编程(Total programming)理念帮助开发者告别partial函数,提升代码质量和可靠性。本文将详细介绍如何利用Relude实现更安全的Haskell编程实践,避免partial函数带来的潜在风险。 ## 什么是partial函数及其危害 在Haskell编程中,partial函数是指不能处理所有可能输

gitblog_00125的博客 702

C语言中errno与perror()函数

宏errno和perror()函数都是在stdlib.h中定义的。 1 stdlib.h头文件 stdlib.h头文件即standard library标准库函数头文件,包含了C、C++语言的最常用的系统函数,该文件中还包含了C语言标准库函数的定义。 2 errno宏 errno宏在stdlib.h中的定义为 #define errno (*_errno()) errno宏用于保存程...

hou09tian的博客 1万+

反卷积通俗详细解析与nn.ConvTranspose2d重要参数解释

反卷积的作用 卷积中padding的几个概念 No Padding Half(Same) Padding Full Padding 反卷积 反卷积中的Padding参数 反卷积的stride参数 反卷积总结 参考资料

iioSnail的博客 2万+

Relude中的类型安全编程:如何避免运行时错误的7个技巧

在Haskell开发中,类型安全是保证代码可靠性的核心要素。然而,标准Prelude中的部分函数存在运行时错误的风险。Relude作为安全、高性能、用户友好的轻量级Haskell标准库,通过一系列精心设计的类型安全特性,帮助开发者编写更可靠的代码。本文将介绍7个关键技巧,帮助你在使用Relude时避免常见的运行时错误。 ## 1. 使用NonEmpty类型替代危险列表操作 🛡️ Relude

gitblog_00242的博客 631

PyRoki:机器人运动学优化库入门教程

PyRoki:模块化机器人运动学优化工具包 本文介绍了PyRoki,一个模块化、可扩展且跨平台的机器人运动学优化工具包。PyRoki通过统一变量和成本函数接口,简化了逆运动学、轨迹优化和运动重定向等任务的实现,支持CPU、GPU和TPU加速。实验表明,PyRoki在批量逆运动学任务中比现有GPU加速库cuRobo快1.4-1.7倍,且收敛误差更低。其模块化设计支持快速集成新成本函数,并通过交互式可视化工具优化参数配置。PyRoki开源发布,为机器人运动优化提供了灵活高效的解决方案。

机器人控制与仿真应用 1290

ZeroGUI-OSWorld-7B两阶段在线RL拆解:从生成任务训练到测试时自适应的持续进化之道

ZeroGUI-OSWorld-7B 是 OpenGVLab 发布的 **GUI 智能体(GUI Agent)多模态模型权重**,配套 ZeroGUI 全自动**在线强化学习(Online RL)**框架,可在 OSWorld 等真实交互环境中以"零人工成本"持续训练与自适应,是当前 GUI Agent 领域"自动出题 + 自动判分 + 持续进化"路线的代表性开源成果。 ## 📦 项目概览:这

gitblog_00647的博客 411

【PySide6拓展】初识QChart图表

在 PySide6 中,QtCharts模块提供了一系列强大的类,用于创建和管理图表。QChart是这个模块的核心类,它可以帮助开发者轻松地实现数据的可视化。本篇文章将介绍如何使用 PySide6 的QtCharts模块,并通过一个简单的示例教你如何快速引入QChart。QChart折线图柱状图饼图区域图它能够直观地呈现数据,同时支持交互功能,如缩放、拖拽和工具提示等。通过引入QChart,我们可以轻松实现数据的可视化,提升应用的交互性和用户体验。结合其他QtCharts。

m0_62599305的博客 820

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

深入解析 mimalloc 通用内存分配器:原理、构建、配置与在 Hasura GraphQL Engine 中的静态覆盖集成

本文以 Hasura GraphQL Engine 仓库内 vendored 的 [mimalloc 2.1.1 完整文档](https://link.gitcode.com/i/bcd9ed92da18ab25a6a4a38ad02d6803)为主体,系统讲解 mimalloc 的设计理念、构建方式、API 用法、环境变量、安全/调试模式、malloc 覆盖机制与配套工具,并结合 [preloa

gitblog_00107的博客 190

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

haskell中list and tuple 的基础函数总结

参考资料 :learnyouahaskell.comList:++ :连接两个list (Haskell里list和string基本相同)ghci&gt; [1,2,3,4] ++ [9,10,11,12]  [1,2,3,4,9,10,11,12]  ghci&gt; "hello" ++ " " ++ "world"  "hello world"  ghci&gt; ['w','o'] ++ ...

憨憨松的博客 1090

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

haskell(20)

18、map和filter Map将函数操作应用在随后的列表中,filter根据第一个参数为条件对随后的列表进行过滤 Prelude> map (>5) [1,6,8,-1,10] [False,True,True,False,True] Prelude> map (+6) [1,6,8,-1,10] [7,12,14,5,16] Prelude> map (/6) [1,6,8,-1

麦好的AI乐园 1897

Haskell语言的函数实现

本文深入探讨了Haskell语言中的函数实现,从基本的函数定义到高阶函数、部分应用、递归及懒加载特性,展示了Haskell的强大功能和优雅的表达方式。通过结合具体例子,我们看到了函数式编程如何使代码更加简洁、优雅。掌握Haskell中的函数实现对于编写高效、可维护的代码至关重要,期望这些内容能为读者在Haskell的学习和应用中提供帮助。Haskell的函数式编程理念不仅在学术界广泛关注,在业界也被越来越多的高性能计算和数据处理应用所采纳。

2501_90384062的博客 414

Haskell语言的后端开发

Haskell是一种强大的语言,适合用于后端开发。它的纯函数式编程特性、强静态类型系统以及并发支持,使得开发高性能、高可靠性的后端服务成为可能。随着Haskell生态系统的不断发展,越来越多的开发者开始关注这门语言,希望能够在后端开发中利用其优势。尽管Haskell也面临一些挑战,如学习曲线较陡和社区相对较小,但这些并不影响其在后端开发中的应用前景。相信随着更多案例的出现,Haskell将会在后端开发领域扮演越来越重要的角色。

2501_91195826的博客 1053
上一篇: 3天学习haskell---haskell第二天
下一篇: haskell排序的操作
crazyhacking
博客等级 码龄15年 299粉丝 148原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值