Haskell之列表的使用

本文介绍了Haskell语言中列表的使用方法及多种实用函数,包括列表概括、过滤、求和等操作,并通过实例展示了如何利用这些技术解决实际问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Haskell中没有循环,不过可以用列表实现。

--多元组和列表可以进行模式匹配,列表概括,多态函数
--可以对多元组进行命名
type Purchase = (String,Int)
addPair :: (Int,Int) ->Int
addPair (x,y) =x+y

--模式匹配
name :: Purchase -> String
name    (s,i) = s

--一个列表由同类型的若干值构成,每个值为列表的一个元素
--多元组的元素个数是有限的,但是可以有不同的类型0
--列表的类型是单一的,但是元素可以有多个
--列表可以表示任何元素序列
--列表可以表示程序中的重复计算
--列表的构造和丰富的多态列表函数便于列表的处理
--每当处理元素序列的时候可以用列表
--用列表求阶乘的函数
fac :: Int -> Int
fac    n = product[1..n]

--列表概括,一般使用格式为[e|x <- list,test]
doubles :: [Int] -> [Int]
doubles    xs = [x*2|x<-xs]

--求一至n的平方和
squaresuM :: [Int]->Int
squaresuM    s = sum[i^2|i<-s]

--过滤列表
factors ::Int -> [Int]
factors   n = [i|i<-[1..n-1],n `mod` i == 0]

--使用因子函数
numFactors :: Int -> Int
numFactors    n = length(factors n)

--测试一个数是否为素数
isPrime :: Int -> Bool
isPrime    a = (numFactors a > 1)

--找出一个小于某个数的所有素数
primes :: Int -> [Int]
primes    n = [x|x<-[2..n],isPrime x]

--找出某一个元素在列表中的位置
--[pos|(xa,pos)<-zip xs [1..length xs],xa==x]这个的结果一个列表
position::Int->[Int]->Int
position   x xs = head[pos|(xa,pos)<-zip xs [1..length xs],xa==x]

--计算路径长度
type Point = (Float,Float)
distance :: Point -> Point -> Float
distance    (x,y) (x',y') = sqrt((x-x')^2+(y-y')^2)
type Path=[Point]
pathLength :: Path -> Float
pathLength   xs = sum[distance p q|(p,q) <- zip(init xs)(tail xs)]

--计算毕达哥拉斯三元组
triads :: Int -> [(Int,Int,Int)]
triads n = [(x,y,z)|x<-[1..n],y<-[1..n],z<-[1..n],x*x + y*y == z*z]

--head是取列表的第一个元素
--last是取最后一个元素
--tail是取除了头部之后的所有元素
--drop是取前n个元素
--take是返回除前n个元素的所有元素
--zip返回的是两个列表对应元素的合并,如想要一起遍历两个列表,请使用zip
--position就是返回某个元素在列表中的位置

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值