Haskellは、主に純粋に機能的なプログラミング言語としての性質のために議論の余地があります。純粋な機能プログラミングは、より伝統的な命令プログラミングとは次の方法で異なります。
1. **純粋な機能の使用**：Haskellの関数は「副作用」を持つことは許可されていません。つまり、入力データを出力データに変換することができ、引数やグローバルな状態の変更など、他の効果を持つことはできません。。
2. **可変性の欠如**：Haskellでは、変数の値が変更されません。データを変更するには、データの変更されたコピーを作成する必要があります。
3.*ループするのではなく再帰の使用**：Haskellにはループがなく、代わりに再帰を使用して繰り返しのアクションを実装します。
4. **高次関数の使用**：高次関数、または他の関数を引数としてとる関数。たとえば、Haskellの「マップ」関数は、最初の引数として関数を取り、リストの各要素に適用し、新しいリストを作成します。

これらの機能により、Haskellやその他の機能的言語の学習は、必須またはオブジェクト指向のプログラミングに使用されるプログラマーにとって直感的で困難になります。ただし、これらの機能には、以下を含む、命令的またはオブジェクト指向の言語には存在しないいくつかの利点があります。
1. ** Haskellプログラムは、**について推論するのが簡単な場合があります：純粋な関数はプログラムの状態に影響を与えることができないため、不純な機能よりもそれらについて推論する方が簡単です。
2. **より簡潔なコード**：機能コードは、命令的なコードよりも簡潔にいくつかのアイデアを表現できます。これが、非常に多くの言語が標準的なライブラリに機能する機能的なプログラミング機能を備えている理由です。
3. ** Laziness **：Haskellは「怠zy」言語です。つまり、必要になるまで計算を延期することにより、プログラムの出力に影響を与えない計算を行わないことを意味します。
Haskell is controversial due primarily to its nature as a purely functional programming language. Pure functional programming differs from the more traditional imperative programming in the following ways:
1. **Use of pure functions**: Haskell's functions are not allowed to have "side effects", meaning that they can only transform input data to output data, and cannot have other effects, such as modifying their arguments or any global state.
2. **Lack of mutability**: Haskell does not allow the value of a variable to be changed. To change any data, you must create a modified copy of the data.
3. **Use of recursion rather than looping**: Haskell does not have loops, and instead uses recursion to implement repeated actions.
4. **Use of higher-order functions**: Higher-order functions, or functions which take other functions as arguments. For example, Haskell's 'map' function takes a function as its first argument, and applies it to each element of a list, creating a new list.

These features can make learning Haskell and other functional language unintuitive and difficult for programmers used to imperative or object-oriented programming. However, these features have some benefits not present in imperative or object-oriented languages, including the following:
1. **Haskell programs can be easier to reason about**: Because pure functions cannot affect any of the program's state, it is easier to reason about them than impure functions.
2. **More concise code**: Functional code can express some ideas more concisely than imperative code could. This is why so many languages have functional programming features built in to their standard libraries.
3. **Laziness**: Haskell is a 'lazy' language, which means that it doesn't do computations that don't affect the output of the program, by deferring computations until they are needed.