As my first programming language, I decided to learn Haskell. I am an analytical philosophy, and Haskell allowed me to quickly and correctly create programs of interest, for example, converters for natural language analysis, theoreticians of theorems and translators. Although I only programmed for two and a half months, I found the Haskell semantics and syntax much easier to learn than the more traditional imperative languages, and now I feel comfortable (with most of my designs).
Haskell programming is like witchcraft, and I would like to expand my programming knowledge. I would like to choose a new programming language to learn, but I don’t have enough time to choose an arbitrary language, drop it and repeat it. So I thought that I would pose a question here, as well as a few points about the type of language I'm looking for. Some of them are subjective, some of them are designed to facilitate the transition from Haskell.
- Strong type system. One of my favorite pieces of programming in Haskell is writing type declarations. This helps to structure my thoughts about individual functions and their relation to the program as a whole. It also facilitates an informal justification of the correctness of my program. I am concerned about correctness, not efficiency.
- Emphasis on recursion, not iteration. I use iterative constructs in Haskell, but implement them recursively. However, it is much easier to understand the structure of a recursive function than a complex iterative procedure, especially when using combinators and higher-order functions, such as maps, folds, and snapping.
- Learning Award. Haskell is a useful language to work with. This is a bit like reading Kant. My experience a few years ago with C, however, was not. I'm not looking for C. The language should impose a conceptually interesting paradigm that, in my completely subjective opinion, C-like doesn't.
Weighing the answers . These, of course, are just notes. I would just like to answer everyone who gave good answers. You were very helpful.
1) Several answers showed that a strong, statically typed language that emphasizes recursion means another functional language. Although I want to continue to work actively with Haskell, camcann and larsmans correctly pointed out that another such language "will make the transition too easy." These comments were very helpful because I do not want to write Haskell in Caml! Of the proofs helpers, Coq and Agda look interesting. In particular, Coq will provide a solid introduction to constructive logic and formal type theory. I spent a bit of time with a first-order predicate and modal logic (Mendelssohn, Enderton, some of Hinman), so I probably would have had a lot of fun with Coq.
2) Others prefer Lisp (generic Lisp, Schema, and Clojure). From what I collect, both Common Lisp and Scheme have excellent introductory material (On Lisp and The Reasoned Schemer, SICP). The stuff in SICP makes me lean toward the Scheme. In particular, the scheme through SICP will cover a different evaluation strategy, the implementation of laziness and the ability to focus on topics such as continuations, interpreters, symbolic calculations, etc. Finally, as others have noted, Lisp code / data processing will be completely new. Therefore, I am strongly inclined towards option (2), Lisp.
3) Thirdly, Prolog. There is a lot of interesting material in Prolog, and its main domain is the one that interests me. It has simple syntax and is easy to read. At the moment, I can not comment anymore, but after reading the Prolog review and removing some introductory materials, he is among the number (2). And it seems like Prolog backtracking is always hacked into Haskell!
4) Of the main languages, Python looks the most interesting. Tim Yates makes languages sound very attractive. Python apparently teaches first-graders CS; therefore, he is either conceptually rich or easy to learn. I will need to do more research.
Thank you all for your recommendations! It seems that it is recommended to use Lisp (Scheme, Clojure), Prolog or a validation helper such as Coq or Agda.