2017-01-26 30 views
0

私はHaskellでは、このコードは試してみました:なぜこのHaskell配列コードは機能しませんか?

array :: (Ix a) => (a,a) -> [(a,b)] -> Array a b 
squares = array (1,100) [(i, i*i) | i <- [1..100]] 

をしかし、私はコードを私はGHCiのことで、このメッセージを取得することを実行すると:

The type signature for array lacks an accompanying binding 
     (The type signature must be given where array is declared) 

伴う結合し、どのようにそれを修正すると意味している正確にどのような?あなたがarray、用型シグネチャを定義するので

+3

あなたの型名は 'array'と呼ばれるものですが、関数は' squares'と呼ばれます。 'array'の型シグネチャを削除し、' Data.Array'からそれをインポートし、 'squares'の注釈を追加する必要があるようです。 –

答えて

3

ないsquaresarrayあなたはもちろんあなた自身を書くことができ、あなたがそれをを再定義しないことができ、ライブラリ関数です)。コンパイラはあなた自身がarrayを定義することを目指していると考えて、 "これは知っていますが、関数定義はどこですか?"のようにのバインディングがありません。

バインディングはその実装(ここではsquares = array (1,100) [(i, i*i) | i <- [1..100]])です。さらに、ブラケットの間にコンパイラは、あなたが望む場所で関数を定義することはできないと言っています。ファンクションシグネチャがあるファイル(シグネチャはそのタイプを:: (Ix a) => (a,a) -> [(a,b)] -> Array a bと定義しています)になければなりません。

squaresに署名することを指定した場合、タイプシグネチャは広すぎますです。最も一般的な型シグネチャは次のとおりです。

squares :: (Enum e, Num e, Ix e) => Array e e 
squares = array (1,100) [(i, i*i) | i <- [1..100]] 
+1

OPの型シグネチャは、実際には 'square 'ではなく' Data.Array'の 'array'の型シグネチャです。 –

+0

@AlexisKing:それは最初のポイント(それがクラッシュする理由)です。 –

+2

私はちょうど私が "あなたのタイプシグネチャを広すぎる"とは思わないと言っていますが、提供されたタイプシグネチャが 'スクエア 'を意図しているように見えないので意味があります。 –

関連する問題