1

Haskell のエラー メッセージを理解するのに少し問題があります。

例えば:

import qualified Data.Map as M

test = M.empty

このコードは、エラー メッセージを表示せずに正常に実行されます。

出力は次のようになります。

*Main> test

fromList []

しかし、私がそのようなことをしようとすると

import qualified Data.Map as M

test = do print M.empty

このようなエラーメッセージが表示されます

Ambiguous type variable `k0' in the constraint:
      (Show k0) arising from a use of `print'
    Probable fix: add a type signature that fixes these type variable(s)
    In a stmt of a 'do' block: print M.empty
    In the expression: do { print M.empty }
    In an equation for `test': test = do { print M.empty }

したがって、printステートメントと関係があると思います。

しかし、コンソール(ghci)で試してみると

Prelude Data.Map> print empty
fromList []

すべて正常に動作します。

だから私は誰かが問題がどこにあるのか私に説明してくれることを願っています.

前もって感謝します。

4

2 に答える 2

7

このコードは、エラー メッセージを表示せずに正常に実行されます。

ソース ファイルでは、そうすべきではありません。

import qualified Data.Map as M

test = M.empty

の推論された型testOrd k => Map k a、制約された型変数を持つポリモーフィック型です。testは関数ではなく、型シグネチャを持たないため、モノモーフィズムの制限により、制約付きの型変数をデフォルトの型に解決することによって、その型をモノモーフィックにする必要があります。ここでの唯一の制約はOrdであるため、デフォルト ルールではその型変数をデフォルトにすることを禁止しています (デフォルトを許可するには、少なくとも 1 つの数値制約が必要です)。

したがって、コンパイルは言語標準によって失敗する必要があります。

ただし、ghci には、型のデフォルト設定を許可する拡張デフォルト設定ルールがあります。を出力したい場合、両方の型変数にtestさらなるShow制約が導入され、ghci は出力を求められたときにtesttoの型をデフォルトに設定します。Map () ()

于 2012-07-24T14:57:01.843 に答える
0

これは、Data.Map.emptyが type を持っているためMap k aです。type のキーkから値 type へのマップa

printprint :: Show a => a -> IO ()これは、 のインスタンスである型のみを表示できることを意味しますが、 typeShowはありますが、そのような制約はありません。任意のタイプまたは-- それらを表示できる必要はありません。M.emptyMap k aka

したがって、基本的に、print表示するように求められているタイプはわかりません。

なぜghciで動作するのかについて; よくわかりません。常駐の Haskell ウィザードの 1 人が、そのことに光を当てることができるかもしれません。

于 2012-07-24T14:56:44.090 に答える