Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/asp.net-mvc-3/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
List Haskell:无限期地重复给定的有限列表_List_Haskell - Fatal编程技术网

List Haskell:无限期地重复给定的有限列表

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的新成员,我试图定义一个函数,它接受一个有限列表,并创建一个无限列表,在每个重复中向列表的每个元素添加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]
[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

您需要的组件包括:

  • map(+1)::Num n=>[n]->[n]
    向列表的每个元素添加1
  • 迭代::(a->a)->a->[a]
    创建一个无限列表,其中每个元素都是前一个元素的函数
  • concat::[[a]]->[a]
    展开列表列表
  • 取9::[a]->[a]
    为了测试,我们将使用它来获取前9个元素,以避免打印无限列表

你自己尝试过吗?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]