2013-10-28 3 views
6

GHCは、トップレベルに機能署名がないことを警告します。なぜ私はそれらが必要なのか分からない。それらを提供するとの問題は、この1(自動生成)のように、彼らは非常に洗練されているということです。トップレベルの関数がHaskellで署名を必要とするのはなぜですか?

applyValue :: forall t t1 t2 t3 t4. 
       (t2 -> t) 
       -> (t2 -> t3 -> t4 -> t1) -> t2 -> t3 -> t4 -> (t -> Bool) -> [t1] 

は、なぜ私はそれらを追加する気でしょうか?

関数自体:マシンチェック可能なドキュメントの形式として

applyValue getValueAt stitchAndMove at fabric mark matchAt = 
    if matchAt (getValueAt at) 
    then [stitchAndMove at fabric mark] 
    else [] 
+0

拡張機能を有効にしていますか? –

+0

いくつかのコードを表示できますか? – jozefg

+6

'-Wall'でコンパイルしているのでこれが起こった場合、' -fno-warn-missing-signatures'を使うことができます。なぜなら、それらを放置しないようにするのがよい習慣だと考えられています。ダニエル・ワグナーの答えを参照してください。 –

答えて

22
  • 。そのタイプが正しいタイプであると信じている場合は、それを置くことで、後で避けられないリファクタリングセッション中にあなた自身のインターフェースを使い切っていないことを二重チェックするようコンパイラーに頼みます。
  • 人間が判読可能なドキュメントです。あなたが観察しているように、恐ろしいマシン生成型を書いていることに気がついたときは、人間が読めるようにするために必要な(型レベルの)抽象化について考えなければなりません。
  • haddockの場合。 Haddockのコメントは、バインディングではなくタイプシグネチャに関連付けられるため、タイプシグネチャを省略すると、注意深く手書きのドキュメントは暗黙のうちに無視されます。
  • エラーメッセージとghciクエリの結果を改善するには:実際に型変数の名前は重要ではありませんが、GHCはユーザーから提供されたときに名前を保持しようとします。 (node -> Bool) -> (edge -> Bool) -> (graph -> Bool)のようなものは、たとえ同等であっても、(t1 -> Bool) -> (t2 -> Bool) -> (t3 -> Bool)よりはるかに読みやすくなります。
+1

あなたのポイントは理にかなっていますが、別の素早い質問があります。署名ブロックを再利用する方法はありますか、関数f1の署名は長くて洗練されていますが、f2はf1を取るので、f2 +ありました。私はいくつかの作業を保存することができますかどうか、いくつかの名前(型?)に署名f1を割り当て、f2の署名を定義するときにその名前で参照してください。ありがとう –

+6

@AlekseyBykovはい、これは 'type'エイリアスがするものです。レポートやお気に入りのチュートリアルでそれらについて読むことができます。 –

+1

文書やエラーメッセージを気にしなくても、署名が必要な場合があります。時には、あなたが必要とする型クラスのインスタンスが曖昧であるため、コンパイルするために明示的に制約する必要があります。 – newacct

関連する問題