List Haskell:无限期地重复给定的有限列表
我是Haskell的新成员,我试图定义一个函数,它接受一个有限列表,并创建一个无限列表,在每个重复中向列表的每个元素添加1。例如,如果我有列表[3,4,5],函数将生成列表[3,4,5,4,5,6,5,6,7..]List Haskell:无限期地重复给定的有限列表,list,haskell,List,Haskell,我是Haskell的新成员,我试图定义一个函数,它接受一个有限列表,并创建一个无限列表,在每个重复中向列表的每个元素添加1。例如,如果我有列表[3,4,5],函数将生成列表[3,4,5,4,5,6,5,6,7..] 我在想一些类似循环的东西,它将是无限的,它会将每个循环添加到每个元素中,然后将其添加到列表中。但问题是我不知道如何用Haskell来写 GHCi中的快速示例: > let f x = x ++ (f $ map (+1) x) > take 10 $ f [3,4,5]
我在想一些类似循环的东西,它将是无限的,它会将每个循环添加到每个元素中,然后将其添加到列表中。但问题是我不知道如何用Haskell来写 GHCi中的快速示例:
> let f x = x ++ (f $ map (+1) x)
> take 10 $ f [3,4,5]
[3,4,5,4,5,6,5,6,7,6]
在这里,我们定义了一个递归函数f
,它只是将递归调用的输出附加到初始列表中,每个数字递增一。我们可以打破它,更仔细地检查功能
GHCi将向您提供有关使用哪种类型的f
的信息
> :t f
f :: Num b => [b] -> [b]
这意味着它将使用Num
实例(如Int
)处理任何事物列表
那么f
做什么呢
> let f x = x ++ (f $ map (+1) x)
^ -- Start with the initial list we pass in
^ -- Modify each element of that list and increment their values by 1.
^ -- This is where the `Num` constraint comes in
^ -- Recursively call f with the new "initial list"
^ -- Append the result of calling f recursively to the initial list
您需要的组件包括:
向列表的每个元素添加1map(+1)::Num n=>[n]->[n]
创建一个无限列表,其中每个元素都是前一个元素的函数迭代::(a->a)->a->[a]
展开列表列表concat::[[a]]->[a]
为了测试,我们将使用它来获取前9个元素,以避免打印无限列表取9::[a]->[a]
你自己尝试过吗?Haskell中没有真正的循环,它都是递归。没有递归
concat(iterate(map(+1))[1,2,3])
λ> [3,4,5] & iterate (map (+ 1)) & concat & take 9
[3,4,5,4,5,6,5,6,7]