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
Haskell 具有上下文传播的无限列表_Haskell - Fatal编程技术网

Haskell 具有上下文传播的无限列表

Haskell 具有上下文传播的无限列表,haskell,Haskell,我想构建一个无限列表,我尝试使用Data.list.iterate,但我需要传播一个上下文。传播时上下文会发生变化 Data.List.iterate的类型为a->a->a->[a] 我需要像a,context->a->context->a,context->[a] 到目前为止,我只获得了[a,context],无法进行映射fst,因为我将获得类似[1,12,123,1234…]的内容,而不是[1,2,3,4…。我认为Unfover正是您想要的: Prelude> import Data.

我想构建一个无限列表,我尝试使用Data.list.iterate,但我需要传播一个上下文。传播时上下文会发生变化

Data.List.iterate的类型为a->a->a->[a]

我需要像a,context->a->context->a,context->[a]

到目前为止,我只获得了[a,context],无法进行映射fst,因为我将获得类似[1,12,123,1234…]的内容,而不是[1,2,3,4…。

我认为Unfover正是您想要的:

Prelude> import Data.List(unfoldr)
Prelude Data.List> :t unfoldr
unfoldr :: (b -> Maybe (a, b)) -> b -> [a]
Prelude Data.List> let nrs = unfoldr (\n -> Just (n,n+1)) 1
Prelude Data.List> take 10 nrs
[1,2,3,4,5,6,7,8,9,10]
它的工作原理如下:

您必须为其提供一个函数,该函数采用上述类型b的状态/上下文,并且:

如果您想继续,只返回输出,newState 如果要停止,则不返回任何内容 所以如果你总是回来只是。。。你会得到一个无限的[output]更新列表:我错过了问题中的map fst注释,但我不明白为什么它不能产生预期的结果

您可以稍后使用迭代并放弃上下文:

iter :: ((a, context)->(a, context)) -> (a, context) -> [a]
iter f x = map fst $ iterate f x
懒惰使得地图不会被应用得太多。只要确保fst。f在上下文参数中是严格的,因此这不会产生大的thunk

它也可以内联使用,因为它非常短:

> take 15 $ map fst $ iterate (\(a,b) -> (b,a+b)) (0,1)
[0,1,1,2,3,5,8,13,21,34,55,89,144,233,377]

根据OPs最后的评论,我认为他知道这一点,但他有点想要最后的元素——不动点;这个list@Carsten哦,我错过了。。。但我不明白。为什么地图fst不适合你?它精确地删除了上下文,并且只有that.fst只返回pair的left元素。如果它没有返回您期望的结果,那么您的pair计算是错误的。