1

注:ワイヤレスカードがコンピューターで壊れており、これにhaskellをインストールできないため、タイプミス(大文字など)がある可能性があるため、コードを再入力しています(メモリスティックxDを持っていません)

私は Config を定義するために使用してき
Config line values 2 2 ましたが、この 1 つの関数「開始」が好きではありません。f -> f を取るものは何でもうまくいきます...

data Config = Config {
                     line :: Line,
                    nums :: [Nums],
                    indent :: Indent,
                       run :: Run
}  deriving (Eq, Show)

class (Result f) => Test f where 
          start :: Line -> [Nums] -> f

 instance Test Config where 
      start line nums = Config line nums 0 0 

私が走れば

 > start 2 [0,0,0]

返すべきもの

 > Config 2 [0,0,0] 0 0

エラーが発生します:

 Ambiguous type variable `f0' in the constraint:
  (Test f0) arising from a use of `start'
Probable fix: add a type signature that fixes these type variable(s)

ランニング

> :t Config 2 [0,0,0] 0 0 

与える

> Config 2 [0,0,0] 0 0 :: Config 

どちらが正しい

4

2 に答える 2

4

さて、メッセージの内容ですが、

start 2 [0,0,0]

のインスタンスである任意の型を持つことができますTest。コンパイラは、型シグネチャを使用して直接、または

> start 2 [0,0,0] :: Config

問題なく動作するか、型を推測できるコンテキストを提供することによって、

> indent $ start 2 [0,0,0]

indentの結果を使用するの型によって型を推論できるようになったため、 も機能するはずですstart

おそらく、コンパイラが型を選択することを期待していたでしょう。Config現時点では、それが唯一のTest. ただし、コンパイラが認識している他のインスタンスがないため、コンパイラはインスタンスを選択しません。これは、他のインスタンスが別のモジュールに追加されたときにコードが壊れる可能性があるためです。

于 2012-05-18T19:38:19.660 に答える
1

問題は、構築された式がclass に属する任意のstart 2 [0,0,0,0]型を返す可能性があることです。システムには、そのインスタンスで を返す方法がありません。明示的にキャストする場合、つまりTestConfig

start 2 [0,0,0] :: Config

それはうまくいくはずです。

于 2012-05-18T19:38:10.743 に答える