想知道核心或第三方库中是否有任何已建立的模式可用于支持此功能?
我使用seq
表达式编写了一个复杂的序列,该表达式采用开始时间和规则列表,规定何时允许在时间线上发生某些事件以创建无限序列。很容易提供任何起始DateTime
值,然后开始前进。结果序列是与时间戳事件对应的seq <DateTime>
。
我想做的是能够在事件的理论时间表上倒退。我希望能够说“返回十步并给我DateTime”,以便我知道我是否将结果应用于原始序列作为输入我最终会回到我开始的位置。
我是否必须扭转复杂的逻辑才能使其发挥作用?或者是否有一种方法可以有效地“强制”我的前向逻辑,这样我就可以继续提供输入,直到我得到的结果正确地给我10步直到指定的DateTime?
我意识到我在解释这个方面做得很差,所以可能是一个简化的例子来帮助想象我所追求的东西。假设我使用一些逻辑模式生成了一系列int。让我们说2的倍数来保持简单:
let seq = [ 2; 4; 6; 8; 10; 12; 14; 16; 18; 20; ]
(虽然这是使用我预定义逻辑的延迟生成的序列)
我可以很容易地从它里面的任何值开始生成这个序列,所以给定12我可以继续前进
let seqFrom12 = [ 12; 14; 16; 18; 20; ]
我希望能够为序列的任何可能值计算我需要提供的值,以便X步骤将我带到序列中的另一个值。
所以我想要序列的所有值,这样X = 3的更多步骤将把我带到序列中的值12。所以我需要重新计算到10,然后是8,然后是6.只有在实际情况下,应用反向逻辑才会更难
答案 0 :(得分:8)
对于SO而言,这不是一个真正的问题。甚至没有博客文章,但实际上,对于一篇有趣的学术论文。但是缺少一条重要的信息 - 你自己编写序列表达式,还是只得到一系列日期(不知道它是如何构造的)?
在第二种情况下,你真的做不了多少。您将不得不使用一些AI或机器学习技术来基本实现一个预测算法,该算法将尝试从您采样的数字中猜测先前的数字。
在第一种情况下,您可以通过远离seq<'T>
而使用您自己的支持向前和向后的数据类型来做某事。例如,像这样:
type BiSeq<'T> =
{ Next : unit -> BiSeq<'T>
Prev : unit -> BiSeq<'T>
Current : 'T }
给定BiSeq<'T>
值,我们可以获得当前的一个,下一个序列以及从前一个点开始的序列。基本实现总是返回相同的值:
let rec always n =
{ Current = n
Prev = fun () -> always n
Next = fun () -> always n }
或者,您可以编写一个需要BiSeq<'T>
的函数并对其执行某些操作。例如,我们可以将当前值增加0,先前增加-2,然后增加+2。更一般地说:
let rec add by start c =
{ Current = c.Current + start
Next = fun () -> add by (start+by) (c.Next())
Prev = fun () -> add by (start-by) (c.Next()) }
这使您可以编写双向序列,如偶数序列:
let evens = add 2 0 (always 0)
evens.Next() // 2
evens.Next().Next() // 4
evens.Next().Next().Next() // 6
evens.Next().Next().Next().Prev() // 4
evens.Prev() // -2
现在你有一个序列可以让你向两个方向移动!要根据这个想法实现任何实际的东西,你可能需要添加某种形式的缓存和很多其他原语。但这可能是一个有趣的方向!
答案 1 :(得分:0)
我想知道问题的一个更简单的解决方案是将历史字典与日期和行动序列保持一致。密钥可以是日期,值可以是当时通过管道传递的值。然后,您不需要退回,您可以根据日期返回。