What's the expected result ?
I had a try as follows, but it's still more awkward than in Haskell or OCaml.
I had a try as follows, but it's still more awkward than in Haskell or OCaml.
let rec s = seq { yield 1
yield! (sn 2) |> combine (sn 3) |> combine (sn 5) }
and sn n = Seq.map (( * ) n) s
and combine sx sy =
let x, y = Seq.hd sx, Seq.hd sy
let x, sx, sy =
if x < y then x, Seq.skip 1 sx, sy
elif x > y then y, sx, Seq.skip 1 sy
else x, Seq.skip 1 sx, Seq.skip 1 sy
seq { yield x
yield! combine sx sy }
My direct attempt to solve that problem hangs up fsi after first 10-15 values :( (stack overflow?)
let rec f =
seq {
yield 1
for i in 1..100 do
if Seq.exists (fun a -> a = i) f then
yield 2*i
yield 3*i
yield 5*i
}
Seq.take 100 f |> Seq.iter (fun i -> printf "%d " i)
>> Seq.exists (fun a -> a = i) f
Would this line keep on consuming f ? May be you need a takewhile or something like that.
I believe this is another case where the laziness of haskell fits more nicely. Though brian's solution is pretty much the same, other than the need for guarding empty sequence.
That brings up another interesting point.
In haskell, one can say
combine [] xs = xs
combine xs [] = xs
combine x:xs y:ys = ...
But that needs to be coded into the combine function f# making this kind of 'more guard' less 'declarative' in nature than haskell.
Is this style of coding possible in F# ?
Would this line keep on consuming f ? May be you need a takewhile or something like that.
I believe this is another case where the laziness of haskell fits more nicely. Though brian's solution is pretty much the same, other than the need for guarding empty sequence.
That brings up another interesting point.
In haskell, one can say
combine [] xs = xs
combine xs [] = xs
combine x:xs y:ys = ...
But that needs to be coded into the combine function f# making this kind of 'more guard' less 'declarative' in nature than haskell.
Is this style of coding possible in F# ?
I have encountered this exact same problem before, years ago when working on FC++, it seems like a pretty famous problem.
Below is one solution, you can probably shorten it even a little more.
Below is one solution, you can probably shorten it even a little more.
#light
let rec combine (LazyList.Cons(h1,t1) as ll1) (LazyList.Cons(h2,t2) as ll2) =
if h1 = h2 then
LazyList.consf h1 (fun() -> combine t1 t2)
elif h1 < h2 then
LazyList.consf h1 (fun() -> combine t1 ll2)
else
LazyList.consf h2 (fun() -> combine t2 ll1)
let rec ll = LazyList.consf 1 (fun() ->
let twos = LazyList.map (fun n -> 2*n) ll
let threes = LazyList.map (fun n -> 3*n) ll
let fives = LazyList.map (fun n -> 5*n) ll
combine (combine twos threes) fives)
for x in LazyList.take 20 ll do
printfn "%d" x
This may be a dumb question, but why do we not have to worry about combine ever being called with an empty list? It seems like you would eventually end up with a MatchFailureException.
Edit: BTW, it actually is a pretty famous problem. read about its history here: [link:en.wikipedia.org]
Edit: BTW, it actually is a pretty famous problem. read about its history here: [link:en.wikipedia.org]
Topic tags
- f# × 3656
- compiler × 263
- functional × 199
- c# × 119
- websharper × 112
- classes × 96
- web × 94
- book × 84
- .net × 82
- async × 72
- parallel × 43
- server × 43
- parsing × 41
- testing × 41
- asynchronous × 30
- monad × 28
- ocaml × 26
- tutorial × 26
- haskell × 25
- workflows × 22
- html × 21
- linq × 21
- introduction × 19
- silverlight × 19
- wpf × 19
- fpish × 18
- collections × 14
- pipeline × 14
- templates × 12
- monads × 11
- opinion × 10
- reactive × 10
- plugin × 9
- scheme × 9
- sitelets × 9
- solid × 9
- basics × 8
- concurrent × 8
- deployment × 8
- how-to × 8
- python × 8
- complexity × 7
- javascript × 6
- jquery × 6
- lisp × 6
- real-world × 6
- workshop × 6
- xaml × 6
- conference × 5
- dsl × 5
- java × 5
- metaprogramming × 5
- ml × 5
- scala × 5
- visual studio × 5
- formlets × 4
- fsi × 4
- lift × 4
- sql × 4
- teaching × 4
- alt.net × 3
- aml × 3
- enhancement × 3
- reflection × 3
- blog × 2
- compilation × 2
- computation expressions × 2
- corporate × 2
- courses × 2
- cufp × 2
- enterprise × 2
- entity framework × 2
- erlang × 2
- events × 2
- f# interactive × 2
- fsc × 2
- google maps × 2
- html5 × 2
- http × 2
- interactive × 2
- interface × 2
- iphone × 2
- iteratee × 2
- jobs × 2
- keynote × 2
- list × 2
- mvc × 2
- numeric × 2
- obfuscation × 2
- oop × 2
- packaging × 2
- pattern matching × 2
- pipelines × 2
- rx × 2
- script × 2
- seq × 2
- sockets × 2
- stm × 2
- tcp × 2
- trie × 2
- type × 2
- type provider × 2
- xna × 2
- zh × 2
- .net interop × 1
- 2012 × 1
- abstract class × 1
- accumulator × 1
- active pattern × 1
- addin × 1
- agents × 1
- agile × 1
- android × 1
- anonymous object × 1
- appcelerator × 1
- architecture × 1
- array × 1
- arrays × 1
- asp.net 4.5 × 1
- asp.net mvc × 1
- asp.net mvc 4 × 1
- asp.net web api × 1
- aspnet × 1
- ast × 1
- b-tree × 1
- bistro × 1
- bug × 1
- camtasia studio × 1
- canvas × 1
- class × 1
- client × 1
- clojure × 1
- closures × 1
- cloud × 1
- cms × 1
- coding diacritics × 1
- color highlighting × 1
- combinator × 1
- confirm × 1
- constructor × 1
- continuation-passing style × 1
- coords × 1
- coursera × 1
- csla × 1
- css × 1
- data × 1
- database × 1
- declarative × 1
- delete × 1
- dhtmlx × 1
- discriminated union × 1
- distance × 1
- docs × 1
- documentation × 1
- dol × 1
- domain × 1
- du × 1
- eclipse × 1
- edsl × 1
- em algorithm × 1
- emacs × 1
- emotion × 1
- error × 1
- etw × 1
- euclidean × 1
- event × 1
- example × 1
- ext js × 1
- extension methods × 1
- extra × 1
- facet pattern × 1
- fantomas × 1
- fear × 1
- fp × 1
- frank × 1
- fsdoc × 1
- fsharp.core × 1
- fsharp.powerpack × 1
- fsharpx × 1
- function × 1
- functional style × 1
- gc × 1
- generic × 1
- geometry × 1
- getlastwin32error × 1
- google × 1
- group × 1
- hash × 1
- history × 1
- hosting × 1
- httpcontext × 1
- https × 1
- hubfs × 1
- ie 8 × 1
- if-doc × 1
- inheritance × 1
- installer × 1
- interpreter × 1
- io × 1
- ios × 1
- ipad × 1
- kendo × 1
- learning × 1
- licensing × 1
- macro × 1
- macros × 1
- maps × 1
- markup × 1
- marshal × 1
- math × 1
- metro style × 1
- micro orm × 1
- minimum-requirements × 1
- multidimensional × 1
- multithreading × 1
- mysql × 1
- mysqlclient × 1
- nancy × 1
- nested × 1
- nested loops × 1
- node × 1
- object relation mapper × 1
- object-oriented × 1
- offline × 1
- option × 1
- orm × 1
- osx × 1
- owin × 1
- paper × 1
- parameter × 1
- performance × 1
- persistent data structure × 1
- phonegap × 1
- pola × 1
- powerpack × 1
- prefix tree × 1
- principle of least authority × 1
- programming × 1
- projekt_feladat × 1
- protected × 1
- provider × 1
- ptvs × 1
- quant × 1
- quotations × 1
- range × 1
- raphael × 1
- razor × 1
- rc × 1
- real-time × 1
- reference × 1
- restful × 1
- round table × 1
- runtime × 1
- scriptcs × 1
- scripting × 1
- service × 1
- session-state × 1
- sitelet × 1
- stickynotes × 1
- stress × 1
- strong name × 1
- structures × 1
- tdd × 1
- template × 1
- tracing × 1
- tsunamiide × 1
- type inference × 1
- type providers × 1
- upload × 1
- vb × 1
- vb.net × 1
- vector × 1
- visual f# × 1
- visual studio 11 × 1
- visual studio shell × 1
- visualstudio × 1
- web api × 1
- webapi × 1
- windows 8 × 1
- windows-phone × 1
- winrt × 1
- xml × 1
|
Copyright (c) 2011-2012 IntelliFactory. All rights reserved. Home | Products | Consulting | Trainings | Blogs | Jobs | Contact Us |
Built with WebSharper |
Write a program that generates the following sequence:
a) 1 is in the sequence
b) An element j is in the sequence if and only if j=2n, 3n, or 5n, where n is in the sequence.
At first I thought this could be represented using a clever sequence expression, but then I decided it can't. So next I wrote a recursive function that uses Set.fold_left to add doubles, triples, and quintuples of elements to the set, and a recursion to build the entire sequence. But since there is no laziness involved the function to build the sequence will never terminate. I still haven't fully wrapped my head around the lazy evaluation or use of the y combinator, but my gut tells me they can come in handy here and this can somehow be represented by a seq<'a>. Anyone care to shed some light?
The solution isn't difficult using more complicated methods, but I want to see if there's a two or three liner that can do this elegantly with laziness.
Thanks