Are there any statically-typed functional languages?

10,449

Solution 1

There are many. Haskell, OCaml and F# come to mind. If you are a Windows developer, F# is very nice and is well supported by Microsoft (along with a very strong StackOverflow community). Lisp family languages (Common Lisp, Scheme, Clojure) are examples of dynamic functional languages.

ActionScript 3 has optional static typing. The Haskell, OCaml and F# compilers, on the other hand, use type inference to deterministically infer types. When you first look at code written in OCaml the absence of explicit types gives it the clutter free look of a dynamically typed language with the type safety of static typing. It is my opinion that optional static typing for dynamic languages (a great idea) will eventually be replaced by type inference and that 10 years from now the static versus dynamic debate will be moot.

Solution 2

My top recommendation for someone like you (presumably with a statically-typed, OO, imperative background) is Scala. Scala is an imperative-functional hybrid with better support for OO than Java and most other languages around. Scala compiles to JVM bytecode (.net is also supported, though used much less) and provides Java interoperability unmatched among non-Java JVM languages. I use Scala in my compiler - jgo and have found writing Scala code exceptionally fun and satisfying. The best resource for learning Scala is Programming in Scala, written by the language designer himself.

If you don't want a hybrid language and instead prefer to jump straight into the fray of FP, I'd go with Haskell. Haskell is a purely functional language; there's no (first-class) notion of mutability or effect. My favorite Haskell resource is the witty Learn You a Haskell for Great Good!. In fact, I'd heavily recommend reading some of LYAH whether or not you intend to go with Haskell, since it's a fantastic introduction to the world of statically typed FP. I'd start reading it even before thinking about language choice.

Solution 3

The type theory was first applied to the functional programming (typed lambda calculus), long before any imperative languages.

For the most advanced static type systems (you won't find anything comparable in the imperative world) check out Coq and Agda.

Solution 4

haskell leaps to mind (although its type system is probably the most advanced out there), the ML family of languages, F# AFAIK.

Solution 5

Some statically typed languages with first-class lexical closures and guaranteed tail call elimination:

without tail call elimination:

  • C# (1999-present)
  • Scala (2008-present)
Share:
10,449

Related videos on Youtube

ericsoco
Author by

ericsoco

once an architect, reborn as a coder/artist/interaction designer. now developing exhibits for san francisco's exploratorium. and still learning.

Updated on June 04, 2022

Comments

  • ericsoco
    ericsoco almost 2 years

    I'm coming from a statically-typed background and investigating functional programming, but I'm not entirely excited about dynamic typing. I'm curious about what kind of options are out there.

    One answer to start: ActionScript 3 is statically-typed and offers some functional paradigms, though AS3 programs don't often use them.

    • comingstorm
      comingstorm over 12 years
      Most "modern functional languages" are statically typed, with highly effective type inference.
  • ibid
    ibid over 12 years
    Actually, type theory comes from the same mathematical tradition that gave us the lambda calculus and the Turing machine, and predates programming languages.
  • SK-logic
    SK-logic over 12 years
    @ibid, of course - I just would not separate functional programming from lambda calculus (and combinatory logic and alikes), and thus functional programming itself predates computing.
  • ibid
    ibid over 12 years
    Well, type theory actually predates lambda calculus as well. The earliest instance I know is the type theory of Russell & Whitehead's Principia Mathematica (1910–1913); the Simple Type Theory, a precursor to typed lambda calculus, dates from the 1920s. See the Wikipedia entry.
  • Totti
    Totti almost 8 years
    @ericsoco: I don't think so. Those are just the last updates to the language that I could find quickly on the internet.
  • ericsoco
    ericsoco almost 8 years
    @jon_harrop why did you specifically call out tail call elimination in your answer?
  • Totti
    Totti almost 8 years
    @ericsoco: I personally don't regard languages without guaranteed TCO as functional languages because they cannot express basic functional idioms like continuation passing style robustly and efficiently. However, many people think Scala and C# are functional languages so I didn't want to exclude them entirely.
  • Qi Luo
    Qi Luo about 7 years
    @JonHarrop What is TCO?
  • Totti
    Totti about 7 years
    @QiLuo: Tail call optimisation.
  • jcc333
    jcc333 over 6 years
    I believe that the CLR has TCO, but I've been wrong before andI don't have a .NET environment set up.
  • Totti
    Totti over 6 years
    The CLR does have TCO but ONLY F# uses it and not C#.
  • Mahendar Patel
    Mahendar Patel almost 4 years
    @JonHarrop In 2020, is it still true that Scala does not have tail call elimination?
  • Totti
    Totti almost 4 years
    I believe so, yes.
  • Jamie S
    Jamie S almost 4 years
    This comment has aged particularly well.
  • devdanke
    devdanke about 3 years
    As of Feb. 2021, Frege looks dead based on the lack of activity in its Github project.
  • devdanke
    devdanke about 3 years
    F# is now officially supported on Linux and Mac.
  • Tim Gautier
    Tim Gautier almost 3 years
    Scala has tail call optimization.