No real minuses discussed here so I thought I'd share some from my FP journey, which was SML -> OCaml -> Haskell -> Clojure. Each had its own sort of enlightenment, both in strengths and weaknesses.<p>IMO an under-appreciated weakness of Haskell is its culture of poor code quality and engineering practices, e.g. in how code is structured, (not) commented, or named.<p>Example, inspecting a graph in Haskell via fgl, we encounter the foundational Decomp type [1]:<p><pre><code> type Decomp g a b = (MContext a b, g a b)
</code></pre>
`a` and `b` are types, and in languages geared towards engineering, we would give them actual names: a is a NodeTag and b is an EdgeTag. But in Haskell it is customary to not provide this information, instead falling back on the type checker to ensure the code is consistent. There is not much effort put into useful naming: map vs mapM vs mapM_...<p>Second example, the simplex algorithm [2]:<p><pre><code> addart :: (Num e, Enum a, Ix a, Num a) =>
Array (a, a) e -> Array (a, a) e
addart a = array ((-1,0),(n,m+n)) $ z ++ xsi ++ b ++ art ++ x
where z = ((-1,0), a!(0,0)) : [ ((-1,j),0) | j <- [1..n] ] ++ [ ((-1,j+n),a!(0,j)) | j <- [1..m] ]
xsi = ((0,0), -colsum a 0) : [ ((0,j),0) | j <- [1..n] ] ++ [ ((0,j+n), -colsum a j) | j <- [1..m] ]
b = [ ((i,0), a!(i,0)) | i <- [1..n] ]
art = [ ((i,j), if i == j then 1 else 0) | i <- [1..n], j <- [1..n] ]
x = [ ((i,j+n), a!(i,j)) | i <- [1..n], j <- [1..m] ]
((_,_),(n,m)) = bounds a
</code></pre>
this code is astonishingly compact, but totally impenetrable. It has no comments, useful names, etc. This write-only code is typical<p>Haskell and its culture have significant weaknesses from an engineering perspective.<p>1: <a href="https://hackage.haskell.org/package/fgl-5.6.0.0/docs/Data-Graph-Inductive-Graph.html#t:Decomp" rel="nofollow">https://hackage.haskell.org/package/fgl-5.6.0.0/docs/Data-Gr...</a><p>2: <a href="https://hackage.haskell.org/package/dsp-0.2.4/docs/src/Matrix-Simplex.html" rel="nofollow">https://hackage.haskell.org/package/dsp-0.2.4/docs/src/Matri...</a>