5 ms·
Weird to see this mix of a very imperative for-range iterative loop with a very functional pattern match, which makes it look similar to an SML or OCaml solutio
by kyllo 12y ago
Weird to see this mix of a very imperative for-range iterative loop with a very functional pattern match, which makes it look similar to an SML or OCaml solution to FizzBuzz. I guess this is the definition of multi-paradigm right here.
Will Rust's type checker warn you of a non-exhaustive pattern match?
- chrismorgan 12y agoNon-exhaustive pattern matching is a compilation error.
- icedog 12y agoHere's the same approach in F# without the different types of String; therefore, easier to get more functional. let fizzbuzz num = match num % 3, num % 5 with | 0,0 -> "FizzBuzz" | 0,_ -> "Fizz" | _,0 -> "Buzz" | _,_ -> num.ToString() [1..100] |> List.map fizzbuzz |> List.iter (fun (s:string) -> printfn "%s" s)
- latkin 12y agoNice F# snippet! This just looks so simple and elegant. As another approach, the "enum" types the OP mentions map to discriminated unions in F#. FWIW your final wildcard match can be (modestly) simplified to just | _ -> num.ToString() and the last line can be distilled to just |> List.iter (printfn "%s")
- mercurial 12y agoAlthough I love pattern matching, I find the solution with 'if' more legible and no less functional.
- minikomi 12y agoAnd racket, just for kicks #lang racket (define (fizz-buzz n) (match (list (modulo n 3) (modulo n 5)) [(list 0 0) "FizzBuzz"] [(list 0 _) "Fizz"] [(list _ 0) "Buzz"] [_ n])) (for [(i (range 100))] (displayln (fizz-buzz i)))
- throwaway283719 12y agoHaskell - fizzbuzz x = case (x `mod` 3, x `mod` 5) of (0, 0) -> "FizzBuzz" (0, _) -> "Fizz" (_, 0) -> "Buzz" _ -> show i mapM_ (putStrLn . fizzbuzz) [1..100]
- throway-4-0-1 12y agoCurrying often allows for elegant point free code. Like in your last line, for F# they could also have written [1..100] |> List.iter (fizzbuzz >> printfn "%s")
- drostie 12y agoPattern matching is one of the ways to get "two-mod" code where the modulus operator is used two times. For example, string concatenation and assignment operators do the same in this Python code: for i in range(1, 101): x = "" if i % 3 == 0: x += "Fizz" if i % 5 == 0: x += "Buzz" if x == "": x += str(i) print(x) If anybody is randomly curious it can be fun to solve FizzBuzz in Haskell the same way that this Python code does it, but (to be more idiomatically Haskell) storing the FizzBuzz success in a Maybe (or some other variable). If you define the appropriate `~>`, and higher-precedence `|~`, and higher-precedence `|~~>`, you can write the above function as: fizzbuzz x = mod x 3 == 0 ~> "Fizz" |~ mod x 5 == 0 ~> "Buzz" |~~> show x It's interesting because it's sort of a "follow-through guards" situation; the (|~) operator can at least be turned into a type signature of (Monoid m) => Maybe m -> Maybe m -> Maybe m.
- deleted 12y ago[deleted]
- deleted 12y ago[deleted]
- deleted 12y ago[deleted]
- deleted 12y ago[deleted]
- bjz_ 12y agoRust was first conceived by an avid Ocamler, and it was originally implemented in Ocaml too. Although the pot has been stirred quite a bit since those early days, the influence still remains, including the expression heavy programming style, pattern matching, 'let's, HM inference, and `var: T` declaration syntax. Whilst Rust is quite procedural and (you rarely use recursion), it often feels quite functional due to those things.
- steveklabnik 12y agoSmall note, technically Rust never did HM, and now we _certainly_ don't. It's still inference, just not that algorithm.
- bjz_ 12y agoOh - I thought it was a variant on HM, extended for region inference?
- steveklabnik 12y agoI'm not _totally_ sure, but I do know when I tried to reference HM in the docs I got yelled at... and now I'm pretty sure we do http://smallcultfollowing.com/babysteps/blog/2014/07/09/an-experimental-new-type-inference-scheme-for-rust/ http://smallcultfollowing.com/babysteps/blog/2014/07/09/an-e...
- kibwen 12y agoIt wasn't strictly HM, as it had extensions for the subtyping that lifetimes require. It was based on HM, however. The new bespoke scheme gives approximately the same results as HM but is drastically simpler. For all I know this could inhibit Rust's future ability to do even more powerful things with types, but AIUI this scheme has the advantage of being actually decidable given the extensions to HM that we would require in the current language. I ain't a type theorist though, so take this as hearsay. :)
- 12y ago
- masklinn 12y ago> Will Rust's type checker warn you of a non-exhaustive pattern match? It refuses to compile entirely.