2009-08-01 9 views
13

質問の他の一般的な間違いの精神で、Haskellのプログラマが最もよく見受けられる間違いは何ですか?私はちょっとハスケルを教えてきました。そして、私は実際の世界でそれを適用するための言語を十分に快適に感じ始めています。ハスケル開発者が避けるべき一般的なプログラミングミス?

+1

もう1つはコミュニティウィキです。 – chaos

+0

このスタイルの質問は、通常、コミュニティWikiとして評価されます。 – zombat

+0

それが生き残ったので、他の "よくあるプログラミングの間違い"がたくさんあるとき、これがなぜ本当の質問ではないのかを想像するのは難しいです。 –

答えて

15

私が知っている最も一般的な間違いは、遅れ評価でスペースリークを導入することです。このミスを達成するには多くの方法がありますが、他の関数プログラミング経験を持つプログラマーを釘付けにするのは、累積パラメーターが一定のスペースをとると考えて、累積パラメーターに結果を入れることです。多くの場合、累積パラメータはパラメータが評価されないため線形空間をとります。

別のよくある間違いはです。letは常に再帰的ですです。意図しない

let x = ... x ... 

は成果を不可解につながることができます。

その他のよくある悪い経験のほとんどは、間違いとしてではなく、プログラムが型チェッカーを通過することの問題や、モナドI/Oモデルの理解が困難なことなどがあります。リスト内包表記の問題やdoの表記では、時折問題が発生します。彼らはI/O 行い、特に、特に型システムにおける

  • トラブルプログラムをコンパイルするために取得し、Haskellのプログラマは、多くの暗いコーナーで

    • 大言語が含まれ始めるが直面する一般的な難しさ、に

    • IOモナドですべてをする
    • 遅延機能プログラムの時間と空間の動作を予測するのが非常に難しい
  • 8

    よくある間違い開始ハスケルプログラマーはforget the difference between constructor and type namespacesです。それは初心者の間違いで、私は自分の名前を付けることに恥ずかしいと思っていましたが、同様の問題が発生したときに他の人がその答えにつきものになることはかなり確信しています。

    4

    [][[]]の違い:空のリストと1要素のリスト、つまり空のリストです。これは、特に、再帰関数の基本ケースでポップアップします。

    -1

    オーバーフローをスタックするために非テール再帰関数を使用するか、厳密なフォールドが発生しないようにします。

    +2

    これは、他の関数型言語よりもHaskellではあまり真実ではありません。多くの場合、怠惰は関数の非テールバージョンをより良い選択にします(例えば、あなたは無限リストを 'foldr'することができますが、tail-recursive' foldl'は毎回爆発します)。 – Chuck

    +1

    私はそれを知っていますが、head(x:xs)= head xs + 1は1000000項目のリストで爆発しませんか? – Hai

    +0

    私は 'head ''(x:xs)=' x '= head' 'xsをx' \ 'seq \' x '+ 1'にしようとしました。誰でも手がかりはありますか? – ScootyPuff

    -1

    表現の概念は、初心者にとってはかなり混乱しています。条件付きの構文を命令型プログラミング言語で使用します。そのコンストラクトがありますが、ハスケルにはその表現があります。したがって、if条件は一致するelseを持つ必要があり、両方とも同じタイプの評価の値を生成する必要があります。

    wrongFunc n = if n > 18 
           then 1 
           else False 
    

    ifブロックは、elseがboolを返すときに整数に評価されます。これはHaskellのような一般的なエラーです。それらは文のブロックではなく式です。

    +3

    なぜそれが混乱しているのかわかりません。私はハスケルの初心者です。同じことをC言語のように比較してください:明示的な戻り値が返されますが、戻り値の型はintまたはboolのいずれかである必要があり、引数の値に応じて1またはfalseを返すとエラーになります。 – Zak

    関連する問題