我对纯粹功能性F#中的eratosthenes筛子的实施很感兴趣.我对实际筛子的实现感兴趣,而不是真正的筛子的天真功能实现,所以不是这样的:
let rec PseudoSieve list =
match list with
| hd::tl -> hd :: (PseudoSieve <| List.filter (fun x -> x % hd <> 0) tl)
| [] -> []
Run Code Online (Sandbox Code Playgroud)
上面的第二个链接简要描述了一个需要使用多图的算法,据我所知,这在F#中是不可用的.给出的Haskell实现使用了一个支持insertWith方法的映射,我在F#功能映射中没有看到它.
有没有人知道将给定的Haskell映射代码转换为F#的方法,或者可能知道替代实现方法或筛选算法哪些有效且更适合功能实现或F#?
是否可以在Prolog中使用惰性列表?类似于以下内容:
ones([1 | Y]) :- ones(Y).
Run Code Online (Sandbox Code Playgroud)
虽然这显然不起作用.
背景:我有一系列连续的,带时间戳的数据.数据序列中有孔,有些大,有些只有一个缺失值.
每当孔只是一个缺失值时,我想使用虚拟值修补孔(较大的孔将被忽略).
我想使用延迟生成修补序列,因此我使用Seq.unfold.
我已经制作了两个版本的方法来修补数据中的漏洞.
第一个消耗带有孔的数据序列并产生修补序列.这就是我想要的,但是当输入序列中的元素数量超过1000时,方法运行得非常慢,并且输入序列包含的元素越多,它就会越来越差.
第二种方法使用带有孔的数据列表并生成修补序列并且运行速度很快.然而,这不是我想要的,因为这会强制整个输入列表在内存中的实例化.
我想使用(sequence - > sequence)方法而不是(list - > sequence)方法,以避免在内存中同时存在整个输入列表.
问题:
1)为什么第一种方法如此缓慢(使用较大的输入列表逐渐变得更糟)(我怀疑它与使用Seq.skip 1重复创建新序列有关,但我不确定)
2)如何使用输入序列而不是输入列表快速修补数据中的空洞?
代码:
open System
// Method 1 (Slow)
let insertDummyValuesWhereASingleValueIsMissing1 (timeBetweenContiguousValues : TimeSpan) (values : seq<(DateTime * float)>) =
let sizeOfHolesToPatch = timeBetweenContiguousValues.Add timeBetweenContiguousValues // Only insert dummy-values when the gap is twice the normal
(None, values) |> Seq.unfold (fun (prevValue, restOfValues) ->
if restOfValues |> Seq.isEmpty then
None // Reached the …Run Code Online (Sandbox Code Playgroud) 我无法理解这段代码:
let
sieve (p:xs) = p : sieve (filter (\ x -> x `mod` p /= 0) xs)
in sieve [2 .. ]
Run Code Online (Sandbox Code Playgroud)
有人可以为我分手吗?我知道它有递归,但这就是问题我无法理解这个例子中的递归是如何工作的.
当我偶然发现一种名为Euler's Sieve的Eratosthenes筛子的改进版本时,我正在阅读不同的筛选算法.根据维基百科,在Haskell中实现了一个稍微不同的想法版本(称为Turner's Sieve).
现在我试图了解代码片段的确切内容,我认为我已经得到了它,但现在我想将代码翻译成F#并且真的不知道从哪里开始.我主要担心的是,似乎没有"减去"两个序列的功能.
这是代码:
import Data.OrdList (minus)
primes = euler [2..]
euler (p : xs) = p : euler (xs `minus` map (*p) (p : xs))
Run Code Online (Sandbox Code Playgroud)
如何在F#中实现?它甚至可能吗?