Coding happens in languages. This works much the same way as natural language, sometimes you’ll speak in a way that is very clear to you and people who speak that language, but not to others.
sumSquares = sum . map (^ 2)
vs
def sumSquares(numbers):
result = 0
for number in numbers:
result += number ** 2
return result
Function composition is clear to people who speak Haskell, and eliminating mutation/untracked side effects helps to keep behavior local and gives equational reasoning. You can ask your IDE what the type of sumSquares is, and immediately know without looking at the implementation that there are no side effects, and what the types are.
On the flip side, most programmers can read basic Python, the C family of languages has seen more adoption, and Python simplifies a lot of the syntax/concepts down to their most basic forms. Python tries to be the most like English, and this is both its greatest strength and weakness (English can be an abysmal language for structured data processing).
You can of course write the Haskell to look more like the Python, or the Python to look more like Haskell. But I’d say the two snippets above represent idiomatic code for those languages, and as someone who actually loves FP, I wish Python never introduced list comprehensions/generator expressions (what a lot of people would use to implement the above in Python). If you’re trying to write typesafe functional code, you should just not be using Python.
Any chance you have an nvidia card? Nvidia for a long time has been in a worse spot on Linux than AMD, which interestingly is the inverse of Windows. A lot of AMD users complain of driver issues on Windows and swap to Nvidia as a result, and the exact opposite happens on Linux.
Nvidia is getting much better on Linux though, and Wayland+explicit sync is coming down the pipeline. With NVK in a couple years it’s quite possible that nvidia/amd Linux experience will be very similar.