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就是返回某个元素在列表中的位置