6 ms·
It would be useful if someone knowledgeable and critical could explain clearly the use of this language. The marketing blather doesn't give me much. I'm not a s
by galago 12y ago
It would be useful if someone knowledgeable and critical could explain clearly the use of this language. The marketing blather doesn't give me much. I'm not a software engineer, so this just seems like a bunch of syntax wankery. I'm probably wrong, I'm just looking for a brief explanation as to why.
- alkonaut 12y agoIt's a functional language for the .NET platform. So you'll want it if you want a functional language and you want to use the .NET platform. Does that answer your question?
- CmonDev 12y agoF# is a hybrid language just as C# is. Just a different flavour of the mix.
- alkonaut 12y agoYes a longer answer is that it is "functional first" just like C# is "OO first". It's safe to say that f# is much closer to ML than Java tough, so it's very much a functional language in a way that C# is not.
- noblethrasher 12y agoReally short answer: F# is to C# as C is to Assembler (I regularly use both C# and F# and don't quite agree with this, but it is defensible). Short answer: Programming, especially OOP, has a lot of prescriptions: things like coding against interfaces rather than implementations, using abstractions, the law of Demeter, avoiding mutations, prefer composition to inheritance, etc. Basically, you can think of F# as a language that compiles down to C#, but follows all of the best practices without fuss. Consider this example of F# code: type Shape = | Circle of float | Square of float let area s = match s with | Circle r -> Math.PI * r * r | Square sd -> sd * sd let perimeter s = match s with | Circle r -> 2 * Math.PI * r | Square sd -> sd * 4 Here is the moral equivalent in C#: public abstract class Shape { public abstract float Area(); public abstract float Perimeter(); } public sealed class Circle { readonly float r; public Circle(float r) { this.r = r; } public override float Perimeter() { return Math.PI * 2 * r; } public override float Area() { return Math.PI * r * r; } } public sealed class Square { readonly float side; public Circle(float side) { this.side = side; } public override float Perimeter() { return 4 * side; } public override float Area() { return side * side; } } A couple of things to note: * The C# code needs 5 times as many line as the F# code (adding a new shape to F# will require about 3 lines, but the corresponding C# class definition will be at least 15 lines). * The F# code is idiomatic, but hardly any C# programmer seals classes or defines them as immutable by default, even though it is a good practice. That said, there are some advantages that C# enjoys. Consider our example code: Even though C# requires more lines of code to define a derivative of Shape, at a certain point it will always be easier to add new classes to C# than the corresponding variant to F# (see "The Expression Problem" - on the other hand, adding new functions that apply to Shape will be easier in F# than adding the corresponding new methods in C#). Also, F# is supposed to be a hardcore statically-typed language, but there are some advanced concepts (e.g. type classes) that are easy to realize in C# yet not in F#.
- CmonDev 12y agoI noticed you sealed the C# classes. What if you want to keep it extensible, which makes sense? How will that extensible pattern matching look then? Also would be interesting to see how long would C#6 code be (twice as short?). Apart from the sample, I also don't understand why F#'s naming patterns are not consistent with the rest of .NET (in terms of starting letter case). Feels alien. Also how come this was considered a sane syntax for arrays? [|1; 2; 3|] instead of [1, 2, 3] Even Haskell's syntax is less alien.
- noblethrasher 12y agoNot to mention indexers. Well, programming languages do have a prescriptive aspect. Arrays in C# 1.0 were more fundamental than List whereas the situation in F# 1.0 was the reverse, and F# doesn't really want you to use arrays as much as it wants you to use list. ... Personally, I always mark my classes as either sealed or abstract. In OO terms, I only care about extending the Shape class, not the individual subclasses because those themselves are are already extensions... of the Shape class. If I did want to extend, say, the Circle class, I would probably make a new abstract class called Ellipse that derived from Shape and then derive Circle from Ellipse. But, I don't really think in strict OO terms any more. C# has a decent type system (despite what my fellow ML programmers might say), but one of the mistakes of the language (i.e. the spec) is that it conflates types with classes. Those are different things. You may see three classes, but I see one type. In this case it's a sum type called Shape that ranges over Circle and Square. A sum type , as you may know, is just the type-theoretic version of logical OR. Indeed, it wasn't until I learned about sum types that I finally understood why you would use an abstract class as opposed to an interface: abstract classes are for when you want to say that a Foo is a Bar OR a Baz OR a Biz whereas interfaces are for when you want to say that Foo is a Bar AND a Baz, AND a Biz.
- CmonDev 12y ago> "In this case it's a sum type called Shape that ranges over Circle and Square" How do I extend Shape to include Triangle without modifying the current code (e.g. in a separate file)?
- enricosada 12y agoThis post is about latest feature added to f# language (syntax cleanup, speed, etc) why use a functional language? see http://fsharpforfunandprofit.com/posts/ten-reasons-not-to-use-a-functional-programming-language/ http://fsharpforfunandprofit.com/posts/ten-reasons-not-to-us... Why use f#? see http://fsharpforfunandprofit.com/why-use-fsharp/ http://fsharpforfunandprofit.com/why-use-fsharp/ (concise for programmers) or http://fpbridge.co.uk/why-fsharp.html http://fpbridge.co.uk/why-fsharp.html (more high level) more info about fsharp at http://fsharp.org/ http://fsharp.org/ my take: #ecosystem - vibrant and friendly community - open source (long time ago, use pr, wrote by community) - cross plat (linux/mac/win/ios/android) - is .NET, same standard library as C# or VB.NET and virtual machine (CLR). Finally open source - use nuget components written for .net - third party component with commercial support #language - fun to use - concise, i can easy write code without boilerplate - multi-paradigm (functional first, but can do oop like c#) - easy interop with c#, native - fast - help write correct code (no null reference => no null reference exception, pattern matching, - easy async, parallel, gpu - unit of measure (like 1<m/s> ) and a lot, read the links above for a better (and faster) summary
- JackMorgan 12y agoF# is a general purpose language. It can do anything Java/C# can do, only shorter and safer. Here is an example of a simple language tool not in Java/C# that makes it easier to write, read, and is safer. http://deliberate-software.com/function-pattern-matching/ http://deliberate-software.com/function-pattern-matching/ F# can also call anything written in .NET, so it's easy to start using it right away. The biggest complaint people have is that it is a totally new language, and the parts that make it simpler and safer take effort to learn. In all honesty, several developers I know don't want to learn it, mostly because they only know C#, and do not believe the claims of speed and safety. They cannot imagine what could be different, so a day or two in, they just think of it as "syntax wankery", and never get past that point. Really, the different syntax just makes it about a third the size of the equivalent C#. That alone is fine, and usually is the reason people prefer languages like Ruby/Python. But the real power comes from deeply understanding computation expressions, the LINQ equivalent, and F# data structures. Those three allow code that is much safer and easier to write, without sacrificing any functionality. At my work, (Winforms app and an MVC4 web site) I use it anywhere I'd use C#.
- fsloth 12y agoGood explanations already, but I'll add my two cents. F# has: * Rich language constructs that encourage pithy and correct code (e.g. arrays and lists are a language type rather than a library datastructure and the syntax facilitates implementing very readably and succintly common operations on them) * The combination of algebraic data structures and pattern matching enables succinct implementation of solutions for lots of common programming problems. This was perhaps the biggest wow feature of the language when I learned to use it well. * Functional languages tend to encourage immutability. F# works idiomatically with mutable data as well, thus being well suited for e.g. numerical code. I would call this letting us have the cake and eat it too. * I don't think there are any specific downsides to F#. Some programs are better expressed in C# still but the .Net platform allows one to access those classes seamlessly from F# side. IMHO, these are all wins. There's not much unnecessary language wankery in F#, it was developed as an industrial tool from day 1. so most features have some rationale behind them.
- oddthink 12y agoI'll try to give a pragmatic example. At work, we've got a lot of analytics code in C# for model-estimation, pricing, etc. I spend a lot of time tweaking models, running them, then extracting and analyzing the results. F# works very well as a scripting language for me, where otherwise I would be using something like IronPython. The results-processing I could do from anything (R, python), but scripting the run (running N random samples of something, doing simple cross-validation, manually hacking a pseudo-hierarchical model, etc.) is much easier when I have direct access to the C# API. Since the codebase is always-evolving, the type checks of F# (as opposed to IronPython) are useful when going back to an old script. I also just enjoy using F#. I'd been hoping to learn a ML-family language for years and working at a F#-friendly shop has let me do that.